java中N个列表的并集
在java中创建N个列表的联合的最佳方法是什么 例如java中N个列表的并集,java,collections,Java,Collections,在java中创建N个列表的联合的最佳方法是什么 例如 List<Integer> LIST_1 = Lists.newArrayList(1); List<Integer> LIST_2 = Lists.newArrayList(2); List<Integer> LIST_3 = Lists.newArrayList(3); List<Integer> LIST_4 = Lists.newArrayList(4); List<Int
List<Integer> LIST_1 = Lists.newArrayList(1);
List<Integer> LIST_2 = Lists.newArrayList(2);
List<Integer> LIST_3 = Lists.newArrayList(3);
List<Integer> LIST_4 = Lists.newArrayList(4);
List<Integer> LIST_1_2_3_4 = Lists.newArrayList(1,2,3,4);
assert LIST_1_2_3_4.equals(union(LIST_1,LIST_2,LIST_3,LIST_4));
The union method will take a var args parameter
<Item> List<Item> union(List<Item> ... itemLists)
List List_1=Lists.newArrayList(1);
List List_2=Lists.newArrayList(2);
List List_3=Lists.newArrayList(3);
List List_4=Lists.newArrayList(4);
List List_1_2_3_4=Lists.newArrayList(1,2,3,4);
断言LIST_1_2_3_4.equals(并集(LIST_1,LIST_2,LIST_3,LIST_4));
union方法将采用var args参数
列表联合(列表…项目列表)
是否有提供此方法的库。最简单的方法是在数组中循环并将每个列表累加为一个我不确定您所说的最佳解决方案是什么,但简单的解决方案需要使用
addAll
方法
为了获得额外的性能,您还可以通过将所有大小相加来提示大小
newarraylist(totalSizeHere)
也可以看到这个答案:可能有一个库,但仅为这3行代码包含它可能不值得再依赖
private static <Item> List<Item> union(List<Item> ... itemLists)
{
List<Item> result = new ArrayList<Item>();
for (List<Item> list : itemLists) result.addAll(list);
return result;
}
私有静态列表联合(列表…项目列表)
{
列表结果=新建ArrayList();
for(List:itemLists)result.addAll(List);
返回结果;
}
您可以使用:
apache collections:,java.util.List)@GrahamGriffiths这似乎只适用于2个列表…或guava:您应该使用一个集合来避免重复的元素,然后返回一个包含您构建的集合中的元素的列表。要避免增加结果列表中内部数组的大小,我会计算结果列表的总大小,然后用总大小创建它。只需循环遍历itemLists,求和它们的大小,并将其作为argumento传递给结果ArrayListcontructor@ZouZou然而,这并不是列表的真正联合,因为每个列表本身都可能包含重复项。@ZouZou这不是问题的一部分。也许元素应该和它们在列表中出现的频率一样多?如果不应该有重复项,那当然是对的。@Thomas我在想一种更数学的方法,即作为参数传递的列表不包含重复的元素。如果不是这样,那么答案是正确的。
Iterables.concat
返回一个Iterable
。我没有找到将Iterable
作为输入的ArrayList构造函数。相反,我使用了番石榴的列表
如下:LIST.newArrayList(Iterables.concat(LIST_1,LIST_2,LIST_3,LIST_4))代码>
List<Integer> joined = new ArrayList<>( Iterables.concat(LIST_1, LIST_2, LIST_3, LIST_4) );
Iterables.elementsEqual( LIST_1_2_3_4, Iterables.concat(LIST_1, LIST_2, LIST_3, LIST_4) );