web-dev-qa-db-fra.com

Combinez plusieurs listes dans Java

Si je veux faire deux listes en une seule en Java, je peux utiliser ListUtils.union(List list1,List list2). Mais que faire si je veux combiner plusieurs listes?

Cela marche:

import org.Apache.commons.collections.ListUtils;
List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);
System.out.println(ListUtils.union(ListUtils.union(list1, list2),ListUtils.union(list3, list4)));

Mais cela ne ressemble pas vraiment à la meilleure solution, ni particulièrement agréable à lire. Malheureusement, ListUtils.union(list1,list2,list3,list4) ne fonctionne pas. Utiliser addAll plusieurs fois et créer sa propre liste rien que pour cela avec des doublons de toutes les entrées ne me semble pas idéal non plus. Alors, que puis-je faire à la place?

19
Fabian Röling

Java 8 permet de le faire facilement à l'aide de Stream API indiqué dans le code ci-dessous. Nous avons essentiellement créé un flux avec toutes les listes, et comme nous avons besoin du contenu individuel des listes, il est nécessaire de l'aplatir avec flatMap et finalement de collecter les éléments dans un fichier List. .

List<Integer>list1=Arrays.asList(1,2,3);
List<Integer>list2=Arrays.asList(4,5,6);
List<Integer>list3=Arrays.asList(7,8,9);
List<Integer>list4=Arrays.asList(10,0,-1);
List<Integer> newList = Stream.of(list1, list2, list3,list4)
                                      .flatMap(Collection::stream)
                                      .collect(Collectors.toList());       
 System.out.println(newList); // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, -1]
39
Pallavi Sonal

Ajout d'autres alternatives:

OPTION 1:

List<Integer> joinedList = joinLists(list1, list2, list3, list4);

public static <T> List<T> joinLists(List<T>... lists) {
        return Arrays.stream(lists).flatMap(Collection::stream).collect(Collectors.toList()); 
}

OPTION 2:

List<Integer> joinedList = new ArrayList<>();
Stream.of(list1, list2, list3, list4).forEach(joinedList::addAll);
4
Sahil Chhabra

Utilisez une liste de tableaux pour lister toutes vos listes ....

ArrayList<String> arrl = new ArrayList<String>();
List<String> list1 = new ArrayList<String>();
    list.add("one");
    list.add("two");
List<String> list2 = new ArrayList<String>();
    list.add("one1");
    list.add("two2");
    arrl.addAll(list1);
arrl.addAll(list2);
    System.out.println("After Copy: "+arrl);

Thats it votre liste sera faite

1
Khan.N

Vous pouvez écrire vos propres méthodes pour fusionner deux listes ou plus. Exemple:

import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import Java.util.stream.Collectors;
import Java.util.stream.Stream;

public class Test{ 
    public static void main(String[] args) {
        List<Integer>list1 = Arrays.asList(1,2,3);
        List<Integer>list2 = Arrays.asList(4,5,6);
        List<Integer>list3 = Arrays.asList(7,8,9);
        List<Integer>list4 = Arrays.asList(10,0,-1);

        System.out.println(combineMyLists(list1,list2,list3,list4));
        System.out.println("----------------------");
        System.out.println(combineMyLists2(list1,list2,list3,list4));
    } 
    private static List<Integer> combineMyLists(List<Integer>... args) {
        List<Integer> combinedList = new ArrayList<>();
        for(List<Integer> list : args){
            for(Integer i: list){
               combinedList.add(i);
            }
        }
        return combinedList;
    }
    private static List<Integer> combineMyLists2(List<Integer>... args) {
        List<Integer> combinedList = Stream.of(args).flatMap(i -> i.stream()).collect(Collectors.toList());   ;
        return combinedList;
    }
}
0
Eritrean