Yinelenen elemanlı bir liste oluşturma


86

Java'da, tüm öğeleri belirli bir değere eşit olan belirli uzunlukta bir liste veya dizi oluşturan bir yardımcı program yöntemi var mı (örn. ["Foo", "foo", "foo", "foo", "foo"])?

Yanıtlar:


150

Kullanabilirsiniz Collections.nCopies. Bunun referansı nesnenin kendisine değil verilen nesneye kopyaladığını unutmayın . Dizelerle çalışıyorsanız, bunun önemi olmayacak çünkü zaten değişmezler.

List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]

1
kusursuz cevap!
Gaurav

20

Bir dizi için Arrays.fill (Object [] a, Object val) kullanabilirsiniz.

String[] strArray = new String[10];
Arrays.fill(strArray, "foo");

ve bir listeye ihtiyacınız varsa, sadece

List<String> asList = Arrays.asList(strArray);

Sonra iki satır kullanmalıyım: String [] strArray = new String [5]; Arrays.fill (strArray, "foo") ;. Tek satırlık bir çözüm var mı?

Bir liste almak için Collections.nCopies'i (5, "foo") tek satırlık bir çözüm olarak kullanabilirsiniz:

List<String> strArray = Collections.nCopies(5, "foo");

veya toArraybir dizi elde etmek için onunla birleştirin .

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);

1
Sonra iki satır kullanmak zorunda: String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. Tek satırlık bir çözüm var mı?
laurt

Çok basit: Collections.nCopies (5, "foo") Thkns!
Marcelo Rebouças

5

İlkel diziler için kullanabileceğiniz sürüm (Java 8):

DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals

Döndüğünü unutmayın double[] , değilDouble[]

IntegerStream, DoubleStream, LongStream için çalışır

UPD

ve dize kopyaları için şunları kullanabilirsiniz:

Stream.generate(() -> "value").limit(400).toArray()

Ekstra kitap gerekmez, tek satır


2

Nesneniz değişmez değilse veya referans şeffaf değilse, kullanabilirsiniz

Stream.generate(YourClass::new).limit(<count>)

ve listeye topla

.collect(Collectors.toList())

veya diziye

.toArray(YourClass[]::new)

1

Kullanarak IntStream, bir dizi tamsayı oluşturabilir, bunları istediğiniz öğeye eşleyebilir ve bir liste olarak toplayabilirsiniz.

List<String> list = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .collect(Collectors.toList());

Veya bir dizi olarak

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
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.