2012-04-21 20 views
13

Hızlı bir sorum var. Java'da sınıf boyunca değişecek uzunluğa ihtiyacı olan bir tamsayı dizim var. Özellikle, belirli durumlarda bir artış için ihtiyacım var. Bunu böyle denedim. Ben gerektiğindeDizinin uzunluğu nasıl artırılır

 sbgHeadX = new int[ numberOfSBG ]; 

Ben tamsayı değişken numberOfSBG artıracak ama bu çalıştığını sanmıyorum. Başka yolu var mı?

+0

Makul bir maksimum sağlayabilir misiniz? Açıkçası diziniz Integer.MAX_VALUE'dan daha büyük olamaz, ancak dizininizin 300'den daha büyük olamayacağını biliyorsanız, uzunluğunu 300 olarak ayarlayabilirsiniz. – emory

+0

@emory - kişisel olarak, güçlü olmak için bunu düşünürdüm kod kokusu: sonuç, bazılarının "kullanılmaması" beklenen bir dizidir. Bu, geçerli öğelerin sayısıyla ayrı bir değişkeni geçmeyi gerektiren bir hata eğilimli ve becerikli kodlama stilidir. Ayrıca, '.size()' nin çalışılacak öğe sayısını vereceği varsayımını da kırar. – ToolmakerSteve

cevap

13

kullanarak. Oluşturulduğunda, bir dizi boyutunu değiştiremezsiniz:

Diziler, tek bir türde sabit sayıda değer içeren bir kapsayıcı nesnedir. Dizi oluşturulduğunda dizinin uzunluğu belirlenir. Oluşturulduktan sonra uzunluğu sabittir.

(Source)

+0

Arraylist'in belirli bir dizinine nasıl erişebilirim? – kullalok

+1

@ user1276078 'yourArraylist.get (2)', sizin 'yourClassicArray [2]' – talnicolas

+1

eşdeğeri Bu çalışırken, OP ilkel bir int olduğunu belirttiğinden, bu gereksiz otomatik kutulamaya neden olabilir. Java koleksiyonları, Nesneleri değer olarak gerektirir, bu nedenle JVM, koleksiyonlar yönteminin her çağrılmasında tüm değerleri Tamsayıya dönüştürecektir. Bu, zaman içinde maliyetli olmanın eklenmesi olabilir. Açıkçası, programcı Hunter McMillen'in aşağıda önerdiği gibi bir şey yapmanın 'tepegözüne' değip değmeyeceğine karar vermeli, fakat cevabı IMHO, soruna daha doğru bir cevap. –

1

Tanım olarak diziler sabit boyutludur. Bunun yerine bir "Dinamik boyut" dizisi olan bir Arraylist kullanabilirsiniz. Aslında, ne olur? VM, ArrayList tarafından gösterilen dizinin "boyutunu ayarla" *.

See also

*

Ben artık uzunluğu hakkında endişelenmenize gerek olmayacak gibi bir ArrayList kullanmasını önerirsiniz geri kopya diziler

+3

* "Gerçekte olan, VM'nin arraylist tarafından açığa çıkan dizinin boyutunu ayarlamasıdır." *. Yanlış. Aslında, ArrayList'in kodu yeni bir destek dizisi oluşturur ve mevcut olanın içeriğini kopyalar. Dizi uzunlukları, JVM tarafından bile değiştirilemez. Java Dil Spesifikasyonu ihlali olur. –

+1

@StephenC Haklısınız. Açıklarken Mi hatası. –

+0

Hala sadece yarı sağın. Ayarlamayı yapan JVM değildir. 'ArrayList' sınıfı bunu sıradan Java kodunda yapar. Ve dizi dizi listesi tarafından maruz DEĞİLDİR ... dizi listesi tarafından HIDDEN olan özel bir nesnedir. –

18

istemediğiniz veya ArrayList kullanamıyorsanız, o zaman bir yardımcı yöntem vardır: korurken, yeni boyutu belirtmek sağlayacak

Arrays.copyOf() 

elementler.

+2

"Bu algoritma, diğer hızlı noktaların karesel performansa indirgenmesine neden olan birçok veri kümesinde n * log (n) performansı sunar." –

21

Java'daki diziler, bildirildiklerinde belirtilen sabit boyuttadır. Dizinin boyutunu arttırmak için daha büyük boyutlu yeni bir dizi oluşturmanız ve tüm eski değerleri yeni diziye kopyalamanız gerekir.

örn:

char[] copyFrom = { 'a', 'b', 'c', 'd', 'e' }; 
char[] copyTo = new char[7]; 

System.out.println(Arrays.toString(copyFrom)); 
System.arraycopy(copyFrom, 0, copyTo, 0, copyFrom.length); 
System.out.println(Arrays.toString(copyTo)); 

Alternatif bir List gibi dinamik bir veri yapısını kullanabilirsiniz.

+2

IMHO, 'Arrays.copyOf()' kullanarak, Jakub'un yanıtında olduğu gibi, daha kısa, daha okunabilir bir kod verir. – ToolmakerSteve

0
Item[] newItemList = new Item[itemList.length+1]; 
    //for loop to go thorough the list one by one 
    for(int i=0; i< itemList.length;i++){ 
     //value is stored here in the new list from the old one 
     newItemList[i]=itemList[i]; 
    } 
    //all the values of the itemLists are stored in a bigger array named newItemList 
    itemList=newItemList; 
0

ArrayList'i kullanabilirsiniz. Dizinin sabit sayıda boyutu vardır.

Bu Example burada size yardımcı olabilir. Örnek çıktıları ile oldukça kolaydır.

 
Output: 
2 5 1 23 14 
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29
İlgili konular