Tworzenie listy z powtarzającym się elementem

86

Czy w Javie istnieje metoda narzędziowa, która generuje listę lub tablicę o określonej długości ze wszystkimi elementami równymi określonej wartości (np. ["Foo", "foo", "foo", "foo", "foo"])?

laurt
źródło

Odpowiedzi:

150

Możesz użyć Collections.nCopies. Zauważ, że kopiuje to odniesienie do danego obiektu, a nie sam obiekt. Jeśli pracujesz ze stringami, nie ma to znaczenia, ponieważ i tak są one niezmienne.

List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]
arshajii
źródło
1
bezbłędna odpowiedź!
Gaurav
20

Dla tablicy możesz użyć Arrays.fill (Object [] a, Object val)

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

a jeśli potrzebujesz listy, po prostu użyj

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

Następnie muszę użyć dwóch wierszy: String [] strArray = new String [5]; Arrays.fill (strArray, "foo") ;. Czy istnieje rozwiązanie jednokreskowe?

Możesz użyć Collections.nCopies (5, "foo") jako jednowierszowego rozwiązania, aby uzyskać listę:

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

lub połącz go z, toArrayaby uzyskać tablicę.

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
René Link
źródło
1
Wtedy muszę korzystać z dwóch linii: String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. Czy istnieje rozwiązanie jednokreskowe?
Laurt
Bardzo proste: Collections.nCopies (5, "foo") Dzięki!
Marcelo Rebouças
5

Wersja, której można używać dla tablic pierwotnych (Java 8):

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

Zauważ, że zwraca double[], nieDouble[]

Działa dla IntegerStream, DoubleStream, LongStream

UPD

a dla dup ciągów możesz użyć:

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

Nie są wymagane żadne dodatkowe biblioteki, jedna linia

maxpovver
źródło
2

Jeśli twój obiekt nie jest niezmienny lub nie jest przezroczysty dla odniesienia, możesz użyć

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

i zbierz go na listę

.collect(Collectors.toList())

lub do szyku

.toArray(YourClass[]::new)
hohserg
źródło
1

Używając IntStream, możesz wygenerować zakres liczb całkowitych, zmapować je na żądany element i zebrać jako listę.

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

Lub jako tablica

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
użytkownik7
źródło