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


86

Есть ли в Java служебный метод, который генерирует список или массив указанной длины со всеми элементами, равными указанному значению (например, ["foo", "foo", "foo", "foo", "foo"])?

Ответы:


150

Вы можете использовать Collections.nCopies. Обратите внимание, что это копирует ссылку на данный объект, а не на сам объект. Если вы работаете со строками, это не имеет значения, потому что они в любом случае неизменяемы.

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

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") Спасибо!
Марсело Ребусас

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.