Erstellen einer Liste mit sich wiederholendem Element

82

Gibt es in Java eine Dienstprogrammmethode, die eine Liste oder ein Array mit einer bestimmten Länge generiert, wobei alle Elemente einem bestimmten Wert entsprechen (z. B. ["foo", "foo", "foo", "foo", "foo"])?

laurt
quelle

Antworten:

144

Sie können verwenden Collections.nCopies. Beachten Sie, dass dadurch der Verweis auf das angegebene Objekt kopiert wird , nicht auf das Objekt selbst. Wenn Sie mit Zeichenfolgen arbeiten, spielt dies keine Rolle, da sie ohnehin unveränderlich sind.

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

Für ein Array können Sie Arrays.fill (Object [] a, Object val) verwenden.

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

und wenn Sie eine Liste benötigen, verwenden Sie einfach

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

Dann muss ich zwei Zeilen verwenden: String [] strArray = new String [5]; Arrays.fill (strArray, "foo");. Gibt es eine einzeilige Lösung?

Sie können Collections.nCopies (5, "foo") als einzeilige Lösung verwenden, um eine Liste zu erhalten:

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

oder kombinieren Sie es mit toArray, um ein Array zu erhalten.

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
René Link
quelle
1
Dann muss ich zwei Zeilen verwenden : String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. Gibt es eine einzeilige Lösung?
Laurt
Sehr einfach: Collections.nCopies (5, "foo") Thkns!
Marcelo Rebouças
4

Version, die Sie für primitive Arrays verwenden können (Java 8):

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

Beachten Sie double[], dass es nicht zurückgibtDouble[]

Funktioniert für IntegerStream, DoubleStream, LongStream

maxpovver
quelle
1

Mit IntStreamkönnen Sie eine Reihe von Ganzzahlen generieren, diese dem gewünschten Element zuordnen und als Liste erfassen.

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

Oder als Array

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
user7
quelle
1

Wenn Ihr Objekt nicht unveränderlich oder nicht referenztransparent ist, können Sie verwenden

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

und sammle es zur Liste

.collect(Collectors.toList())

oder zu Array

.toArray(YourClass[]::new)
hohserg
quelle