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.

4voto

alex Punkte 5154

Verwenden Sie eine Helper-Klasse.

Ich schlage vor:

public static <E> Collection<E> addAll(Collection<E> dest, Collection<? extends E>... src) {
    for(Collection<? extends E> c : src) {
        dest.addAll(c);
    }

    return dest;
}

public static void main(String[] args) {
    System.out.println(addAll(new ArrayList<Object>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));

    // does not compile
    // System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));

    System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList(4, 5, 6)));
}

2voto

ddimitrov Punkte 3259

Ich behaupte nicht, dass es einfach ist, aber Sie haben einen Bonus für Einzeiler erwähnt ;-)

Collection mergedList = Collections.list(new sun.misc.CompoundEnumeration(new Enumeration[] {
    new Vector(list1).elements(),
    new Vector(list2).elements(),
    ...
}))

0 Stimmen

Warum sollte man sie nie benutzen?

6 Stimmen

@David, weil es intern im JDK verwendet werden sollte. Wenn Sie das in Ihrem Code verwendet haben, wird Ihr Code höchstwahrscheinlich nicht auf Nicht-Sun (oder jetzt Nicht-Oracle) JDK/JRE laufen.

0 Stimmen

@AdrianShum Gibt es andere JDKs/JREs als Oracle? Das würde mich überraschen. Selbst wenn man sich auf die gängigsten API-Funktionen beschränkt, würde es wahrscheinlich ewig dauern, das ganze Zeug neu zu bauen...

0voto

shinzou Punkte 5369

Hier ist ein Ansatz, der Streams und Java 8 verwendet, wenn Ihre Listen verschiedene Typen haben und Sie sie zu einer Liste eines anderen Typs kombinieren möchten.

public static void main(String[] args) {
    List<String> list2 = new ArrayList<>();
    List<Pair<Integer, String>> list1 = new ArrayList<>();

    list2.add("asd");
    list2.add("asdaf");
    list1.add(new Pair<>(1, "werwe"));
    list1.add(new Pair<>(2, "tyutyu"));

    Stream stream = Stream.concat(list1.stream(), list2.stream());

    List<Pair<Integer, String>> res = (List<Pair<Integer, String>>) stream
            .map(item -> {
                if (item instanceof String) {
                    return new Pair<>(0, item);
                }
                else {
                    return new Pair<>(((Pair<Integer, String>)item).getKey(), ((Pair<Integer, String>)item).getValue());
                }
            })
            .collect(Collectors.toList());
}

0voto

Jan Weitz Punkte 444

Wenn Sie dies statisch tun wollen, können Sie wie folgt vorgehen.

Die Beispiele verwenden 2 EnumSets in natürlicher Reihenfolge (==Enum-order) A, B und verbindet sich dann in einem ALL Liste.

public static final EnumSet<MyType> CATEGORY_A = EnumSet.of(A_1, A_2);
public static final EnumSet<MyType> CATEGORY_B = EnumSet.of(B_1, B_2, B_3);

public static final List<MyType> ALL = 
              Collections.unmodifiableList(
                  new ArrayList<MyType>(CATEGORY_A.size() + CATEGORY_B.size())
                  {{
                      addAll(CATEGORY_A);
                      addAll(CATEGORY_B);
                  }}
              );

0 Stimmen

Dadurch würde eine neue anonyme Klasse entstehen. Nicht empfohlener Ansatz!

0voto

nirmal Punkte 9

Keineswegs ein Einzeiler, aber ich glaube, das ist der einfachste:

List<String> newList = new ArrayList<String>(l1);
newList.addAll(l2);

for(String w:newList)
        System.out.printf("%s ", w);

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