在Java中合并多个列表

ctehm74n  于 2023-06-20  发布在  Java
关注(0)|答案(5)|浏览(130)

如果我想在Java中将两个列表合并为一个,我可以使用ListUtils.union(List list1,List list2)。但如果我想合并多个列表呢?
这个方法的作用是:

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

但它看起来并不是最好的解决方案,也不是特别好读。ListUtils.union(list1,list2,list3,list4)不能用多次使用addAll并创建它自己的列表,其中包含所有条目的副本,这对我来说似乎也不理想。那我能做什么呢

rpppsulh

rpppsulh1#

Java 8有一个简单的方法,可以在下面代码中显示的Stream API的帮助下完成。我们基本上已经创建了一个包含所有列表的流,然后因为我们需要列表的各个内容,所以需要用flatMap将其展平,最后收集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]
mfpqipee

mfpqipee2#

添加其他备选方案:

选项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()); 
}

选项二:

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

eqqqjvef3#

使用ArrayList列出所有列表....

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

这就是你的名单将作出

k4emjkb1

k4emjkb14#

您可以编写自己的方法来合并两个或多个列表。示例:

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;
    }
}
f2uvfpb9

f2uvfpb95#

如果连接多个列表或大型列表,源列表有一个高效的toArray()实现,目标列表有一种方法来请求显式的大小,以及一个高效的addAll()实现,你可以比一个简单的toList()保存很多时间。ArrayList可能是最常用的List,它具有所有这三个特性。
调用sized ArrayList构造函数执行单个分配,使用addAll()消除了每次将一个元素低效地复制到目标List中的需要。

@SafeVarargs
    public static <T> List<T> concatListsJava8(List<T>... lists) {
        int totalSize = Math.toIntExact(
                Arrays.stream(lists)
                .mapToLong(List::size)
                .sum());

        List<T> newList = new ArrayList<>(totalSize);

        Arrays.asList(lists).forEach(newList::addAll);

        return newList;
    }

    public static <T> List<T> concatListsJava5(List<T>... lists) {
        final int numLists = lists.length;
        int totalSize = 0;
        for (int i = 0; i < numLists; ++i) {
            totalSize += lists[i].size();
            if (totalSize < 0) {
                throw new ArithmeticException("integer overflow");
            }
        }

        List<T> newList = new ArrayList<T>(totalSize);

        for (int i = 0; i < numLists; ++i) {
            newList.addAll(lists[i]);
        }
        return newList;
    }

相关问题