Створення списку з повторюваним елементом


86

Чи існує в Java корисний метод, який генерує список або масив заданої довжини з усіма елементами, що дорівнюють зазначеному значенню (наприклад, ["foo", "foo", "foo", "foo", "foo"])?

Відповіді:


150

Можна використовувати Collections.nCopies. Зауважте, що це копіює посилання на даний об’єкт, а не на сам об’єкт. Якщо ви працюєте зі рядками, це не матиме значення, оскільки вони все одно незмінні.

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

1
бездоганна відповідь!
Gaurav

20

Для масиву ви можете використовувати Arrays.fill (Object [] a, Object val)

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

а якщо вам потрібен список, просто використовуйте

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

Тоді я повинен використовувати два рядки: String [] strArray = new String [5]; Arrays.fill (strArray, "foo") ;. Чи існує однолінійне рішення?

Ви можете використовувати Collections.nCopies (5, "foo") як однорядкове рішення для отримання списку:

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

або комбінуйте його, toArrayщоб отримати масив.

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

1
Тоді я повинен використовувати два рядки: String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. Чи існує однолінійне рішення?
laurt

Дуже просто: Collections.nCopies (5, "foo") Thkns!
Марсело Ребусас

5

Версія, яку ви можете використовувати для примітивних масивів (Java 8):

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

Зверніть увагу, що він повертається double[], ніDouble[]

Працює для IntegerStream, DoubleStream, LongStream

UPD

а для стрибків струн можна використовувати:

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

Не потрібні зайві ваги, один рядок


2

Якщо ваш об’єкт не є незмінним або не є прозорим для посилань, ви можете використовувати

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

і зібрати його до списку

.collect(Collectors.toList())

або в масив

.toArray(YourClass[]::new)

1

Використовуючи IntStream, ви можете сформувати діапазон цілих чисел, зіставити їх з потрібним елементом і зібрати у вигляді списку.

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

Або як масив

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.