Java'da Değişken Uzunlukta (Dinamik) Diziler


108

Programımın yürütülmesi sırasında boyutu ve değerleri değişecek şekilde bir tamsayı dizisini nasıl başlatacağımı merak ediyordum, herhangi bir öneriniz var mı?

Yanıtlar:


121

Evet: ArrayList kullan .

Java'da "normal" diziler sabit boyuttadır. Onlara bir beden vermelisiniz ve onları genişletemez veya küçültemezsiniz. Boyutu değiştirmek için, yeni bir dizi oluşturmanız ve istediğiniz verileri kopyalamanız gerekir - bu sizin için verimsiz ve acı verici bir durumdur.

Neyse ki, ortak veri yapılarını ve diğer kullanışlı araçları uygulayan her tür yerleşik sınıf vardır. Tam listesi için Java 6 API'sini kontrol etmek isteyeceksiniz .

Bir uyarı: ArrayList yalnızca nesneleri (ör. Tamsayılar) tutabilir, ilkelleri (ör. İnts) tutamaz. ÇOĞU durumda, otomatik kutulama / otomatik kutulama bunu sizin için sessizce halledecektir , ancak ne yaptığınıza bağlı olarak bazı garip davranışlar yaşayabilirsiniz.


2
Java'da aşağıdaki kodun neden doğru olduğunu merak ediyorum? int[] array = new int[size]; sizebir değişkendir, ancak bir dizinin uzunluğu sabit olmalı, değil mi? @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu evet, sizeprogram devam ederken dizinin boyutu eşleşecek şekilde değişmez ; sizesatır yürütüldüğünde hangi boyutta olursa olsun alır .
Pops

Bir ArrayList'ten bir öğeyi her kaldırdığımda, sonunda bir nullile sonuçlanır. Herhangi bir fikriniz neden?
Aaron Franke

37

Java'daki diziler sabit boyuttadır. İhtiyacınız olan şey, Java'da bulunan son derece değerli Koleksiyonlardan biri olan bir ArrayList'tir.

Onun yerine

Integer[] ints = new Integer[x]

kullan

List<Integer> ints = new ArrayList<Integer>();

Daha sonra kullandığınız listeyi değiştirmek için ints.add(y)ve ints.remove(z)diğer birçok kullanışlı yöntem arasında uygun Javadoc'larda bulabilirsiniz.

Java'da bulunan Koleksiyonlar sınıflarını çok güçlü oldukları ve size Java ile yeni başlayanların gereksiz yere kendilerini yeniden yazma eğiliminde oldukları birçok yerleşik işlevsellik sağladıkları için incelemenizi şiddetle tavsiye ederim.


ben deneyene kadar çalışmak istiyorum: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
List<Integer>Bunun yerine neden kullanıyorsun ArrayList<Integer>?
Dean Meehan

25

Diziler, somutlaştırıldıktan sonra sabit boyuttadır. Bunun yerine bir Liste kullanabilirsiniz.

Otomatik kutulama bir Listeyi bir diziye benzer şekilde kullanılabilir hale getirir, içine basitçe int-değerleri koyabilirsiniz:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Neden ArrayList değil de List türünde bir başvuru değişkeni bildiriyorsunuz?
LppEdd

2
Gerekirse Liste uygulamaları arasında kolayca geçiş yapmanıza izin verdiği için, yalnızca yeni XYZList () 'i değiştirmeniz gerekir. Değişken ArrayList olarak bildirilirse, oyu bu uygulamaya özgü yöntemler kullanabilir ve bu da değişikliği daha karmaşık hale getirir.
Mnementh

1
Teşekkürler, anlıyorum.
LppEdd

11

Ben önceki cevaplar düşündüren katılmıyorum ArrayListçünkü ArrayListolduğunu değil Dinamik Dizi ancak Liste bir dizi tarafından desteklenen. Aradaki fark, aşağıdakileri yapamayacak olmanızdır:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Size bir IndexOutOfBoundsException verecektir, çünkü bu konumda henüz hiçbir öğe yoktur, ancak destek dizisi böyle bir eklemeye izin verse bile. Dolayısıyla, @ randy-lance tarafından önerildiği gibi özel bir genişletilebilir Array uygulaması kullanmanız gerekir



Java8 kaynak kodunda gördüğüm gibi ArrayList'in herhangi bir put yöntemi olup olmadığından emin değilim. Sadece verilen kapasite ile nasıl davrandığını bulmaya çalışıyorum. Ancak ArrayList.add () yöntemi bulundu.
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

Kaynak: Dinamik dizi nasıl yapılır


7
  1. Küçük ölçekli boyutlarla uğraşmak için Liste kullanılması önerilir.

  2. Çok sayıda numaranız varsa, Liste ve otomatik kutulamayı ASLA kullanmayın.

    <Tamsayı> listesi listesi

Her bir tamsayı için otomatik olarak yeni bir Tamsayı oluşturulur. Listenin boyutu arttığında yavaşladığını göreceksiniz. Bu Tamsayılar gereksiz nesnelerdir. Bu durumda tahmini bir beden kullanmak daha iyi olur,

int[] array = new int[ESTIMATED_SIZE];

4

ListBunun yerine a kullanmaya ne dersiniz ? Örneğin,ArrayList<integer>


4

Bir dizinin boyutunu değiştiremezsiniz. Bununla birlikte, doğru boyutta yeni bir dizi oluşturabilir ve verileri eski diziden yeniye kopyalayabilirsiniz.

Ancak en iyi seçeneğiniz, jacarta commons'tan IntList'i kullanmaktır. ( burada )

Tıpkı bir List gibi çalışır, ancak daha az yer kaplar ve bundan daha etkilidir, çünkü sarmalayıcı nesnelerini int'ler üzerinde depolamak yerine int'leri depolar (Tamsayı sınıfı budur).


-4

Bu soruyu cevapladım ve hayır, bir dizi listesine veya başka bir şeye ihtiyacınız yok, bu bir ödevdi ve evet dizilerinin boyutu artabilsin diye tamamladım. İşte Java Dinamik Dizisi nasıl kullanılır bağlantısı ve işte Java Dinamik dizilerini yanıtladığım sorumun bağlantısı


1
bu sadece yanlış. bağlantılı yanıt System.arrayCopy () 'yi çağırır, eski diziyi daha büyük boyutlu yeni bir diziye kopyalar ve ardından yeni girişi ekler. diziler hala dinamik boyuta sahip olamaz.
katzenhut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.