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"])?

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]

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]);

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


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);

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.