Java'daki tüm sıfırlarla bir ArrayList'i nasıl başlatabilirim?


161

Görünüşe göre arraylistişini sunmak için yapmıyor:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

Daha sonra erişmeye çalıştığımda:

list.get(5) 

0 döndürmek yerine, IndexOutOfBoundsException: Index 5 uzunluğu 0 için sınırların dışına atar .

Tüm öğeleri C ++ 'ın yaptığı gibi tam boyutta 0 olarak başlatmanın bir yolu var mı?


4
Bu kurucunun Javadoc'u "boş liste" oluşturduğunu belirtir. İşini yapıyor.
ColinD

Yanıtlar:


429

Yapıcıya iletilen tam sayı, başlangıç ​​kapasitesini , yani dahili dizisini yeniden boyutlandırması gerekmeden önce tutabileceği öğe sayısını temsil eder (ve listedeki ilk öğe sayısıyla ilgisi yoktur).

Bir listeyi 60 sıfır ile başlatmak için şunları yaparsınız:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

60 farklı nesne içeren bir liste oluşturmak istiyorsanız , Akış API'sını Supplieraşağıdaki gibi kullanabilirsiniz :

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

1
Bu benim çözümümden çok daha iyi. ArrayListYine de yeni bir şey yapmamanızı tavsiye ederim ve bunun yerine sadece programlayın List. Bu elbette OP'ye kalan bir karar.
corsiKa

6
Döndürülen liste nCopiesdeğiştirilemez, bu nedenle yeni bir tane oluşturmak ArrayListmuhtemelen iyi bir fikirdir.
aioobe

4
nCopiesKarmaşık bir nesneyle kullanıldığında, koleksiyonun 60 farklı nesne ile değil, aynı nesne ile 60 kez başlatıldığına dikkat edin . Bu yüzden sadece ilkel araçlar için kullanın.
membersound

1
membersound, ben nCopiesreferans türleri ile yararlı birçok senaryo düşünebilirsiniz : dizeleri, boş nesne desenleri, numaralama sabitleri gibi değişmez nesneler ... Neyse, ben cevap 60 farklı nesne oluşturmak için bir çözüm ile güncelledim.
aioobe

@ aioobe Biliyorum, ncopies yararlı olduğu birçok senaryo var. Ben sadece eklemek için istedim, değişebilir nesnelerle ncopies denedim ve beklediğim gibi işe yaramadı şaşırdı. Herkesin aynı görevi yapması durumunda. olsa güncelleme için teşekkürler!
Üye

12
// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

2
Bu sadece bir listeyi mevcut girişlerle doldurur. İstendiği gibi öğelerle başlatmaz.
WhiteFang34

Bu, listeyi 60 sıfırla doldurmaz.
aioobe

Olsa bile, herhangi bir şey yaratması gerekmeyen 60 nesne yaratacaktır.
ColinD

1
@Frost: IndexOutOfBoundsExceptionile bir alacaksınızList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

2
Arrays.asListListeklemeye veya kaldırmaya izin vermeyen bir tane üretir , bu nedenle OP'nin istediği ile aynı değildir. Yapmanız gereken tek şey olsa işe yarar set, ancak bu durumda sadece bir dizi kullanmak daha iyi olabilir.
ColinD

8

Geçtiğiniz 60, yalnızca dahili depolama kapasitesidir. Ne kadar büyük olabileceğini düşündüğünüze dair bir ipucu, ancak elbette bununla sınırlı değil. Değerleri önceden ayarlamanız gerekiyorsa, bunları kendiniz ayarlamanız gerekir, örneğin:

for (int i = 0; i < 60; i++) {
    list.add(0);
}

4

Java 8 uygulaması (Liste 60sıfırlarla başlatıldı ) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - sıfır ve uzunluk N ile dolu bir dizi oluşturur
  • boxed() - her eleman bir Tamsayıya kutulanmış
  • collect(Collectors.toList()) - akarsu unsurlarını toplar

0

Öyle değil. ArrayList, diziyi yalnızca dahili saygı olarak kullanır. 60'tan fazla öğe eklerseniz, alt katman dizisi genişler. Bu diziye sahip olduğunuz RAM kadar element ekleyebilirsiniz.

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.