1086 Stimmen

Wie kann ich zwei Listen in Java verbinden?

Bedingungen: keine Änderung der ursprünglichen Listen; nur JDK, keine externen Bibliotheken. Bonuspunkte für einen Einzeiler oder eine JDK 1.3 Version.

Gibt es einen einfacheren Weg als:

List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);

7 Stimmen

Wenn Sie tun dies ausschließlich für Iteration Zwecke siehe eine andere Frage - es gibt Google Guava und Java 8 Lösungen stackoverflow.com/questions/4896662/

0 Stimmen

Java 8-Lösung mit Utility-Methode: stackoverflow.com/a/37386846/1216775

0 Stimmen

Dies ist nur eine der vielen Unzulänglichkeiten der Java Collections API.

13voto

deterb Punkte 3944

Sie können einen Einzeiler machen, wenn die Zielliste vordeklariert ist.

(newList = new ArrayList<String>(list1)).addAll(list2);

10voto

Saravana Punkte 11985

Eine weitere One-Liner-Lösung mit Java8 Strom, da flatMap Lösung ist bereits veröffentlicht, hier ist eine Lösung ohne flatMap

List<E> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);

ou

List<E> ints = Stream.of(list1, list2).collect(ArrayList::new, List::addAll, List::addAll);

Code

    List<List<Integer>> lol = Arrays.asList(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
    List<Integer> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);
    System.out.println(lol);
    System.out.println(li);

sortie

[[1, 2, 3], [4, 5, 6]]
[1, 2, 3, 4, 5, 6]

1 Stimmen

Ich möchte hinzufügen, dass diese Lösung wahrscheinlich leistungsfähiger ist als die Lösung mit flatMap da die Listen nur einmal beim Sammeln durchlaufen werden

0 Stimmen

Ich glaube nicht, dass flatMap eine zusätzliche Iteration verursacht, könnten Sie das klären?

9voto

Himank Batra Punkte 251

Wir können 2 Listen mit java8 mit 2 Ansätzen verbinden.

    List<String> list1 = Arrays.asList("S", "T");
    List<String> list2 = Arrays.asList("U", "V");

1) Mit concat :

    List<String> collect2 = Stream.concat(list1.stream(), list2.stream()).collect(toList());
    System.out.println("collect2 = " + collect2); // collect2 = [S, T, U, V]

2) Verwendung von flatMap :

    List<String> collect3 = Stream.of(list1, list2).flatMap(Collection::stream).collect(toList());
    System.out.println("collect3 = " + collect3); // collect3 = [S, T, U, V]

3 Stimmen

Wenn Sie eine elf Jahre alte Frage mit dreißig anderen Antworten beantworten, sollten Sie darauf hinweisen, auf welche neuen Aspekte der Frage Ihre Antwort eingeht, und vermerken, ob diese Techniken auch funktioniert hätten, als die Frage gestellt wurde, oder ob sie von Funktionen abhängen, die im Laufe der Jahre eingeführt wurden.

8voto

Olivier Faucheux Punkte 2372

Meiner Meinung nach der klügste:

/**
 * @param smallLists
 * @return one big list containing all elements of the small ones, in the same order.
 */
public static <E> List<E> concatenate (final List<E> ... smallLists)
{
    final ArrayList<E> bigList = new ArrayList<E>();
    for (final List<E> list: smallLists)
    {
        bigList.addAll(list);
    }
    return bigList;
}

5 Stimmen

Vergessen Sie nicht die @SafeVarargs !

8voto

Raymond Chenon Punkte 10104

Fast alle Antworten schlagen die Verwendung einer ArrayList vor.

List<String> newList = new LinkedList<>(listOne);
newList.addAll(listTwo);

Verwenden Sie lieber eine LinkedList für effiziente Hinzufügungsoperationen.

ArrayList add ist O(1) amortisiert, aber O(n) im schlimmsten Fall, da die Größe des Arrays geändert und kopiert werden muss. Während LinkedList add immer konstant O(1) ist.

mehr Infos https://stackoverflow.com/a/322742/311420

4 Stimmen

Ohne Leistungsvergleiche ist dies ein fragwürdiger Ratschlag, zumal Ihr Argument über add bezieht sich nicht auf die Masse addAll Betrieb.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X