在java中列出交集

lea*_*sql 44 java

我有两个ArrayList<Integer>如下:

原版的: 12, 16, 17, 19, 101

选择: 16, 19, 107, 108, 109

我想在这些列表上做交集/联合,最后我有两个列表:

加: 108,109,107

去掉: 12, 17, 101

原始列表和所选列表的长度各不相同,一个可以比另一个更大/更小

bar*_*ddu 49

作为替代方案,您可以使用Apache commons库中的CollectionUtils.它具有适合您情况的静态交集,并集减法方法.


Ada*_*dam 41

List<Integer> original = Arrays.asList(12,16,17,19,101);
List<Integer> selected = Arrays.asList(16,19,107,108,109);

ArrayList<Integer> add = new ArrayList<Integer>(selected);
add.removeAll(original);
System.out.println("Add: " + add);

ArrayList<Integer> remove = new ArrayList<Integer>(original);
remove.removeAll(selected);
System.out.println("Remove: " + remove);
Run Code Online (Sandbox Code Playgroud)

输出:

Add: [107, 108, 109]
Remove: [12, 17, 101]
Run Code Online (Sandbox Code Playgroud)

使用Collection的removeAll方法.见javadocs.

  • 请注意`removeAll`会删除每个值的_all_ occurrence,所以如果'16'在`selected`中两次,它仍然不会在最后的`add`中.因此,如果您需要检测重复项(例如,在列表中查找缺失,意外和重复项),则不适用. (2认同)

ACV*_*ACV 23

交叉口:original.retainAll(selected).

之后,原始文件将仅包含两个集合中的元素.如果有任何改变,返回true.

警告:对于大型集合,此方法非常慢


Pet*_*rey 8

对于交集和联合操作,自然集合类型是Set而不是List,它的使用效率也更高.


Ser*_*hyk 6

使用Guava库:

List<Integer> listA = Lists.newArrayList(12,16,17,19,101);
List<Integer> listB = Lists.newArrayList(16,19,107,108,109);
Set<Integer> intersection = Sets.intersection(Sets.newHashSet(listA), Sets.newHashSet(listB));
listA.removeAll(intersection);
listB.removeAll(intersection);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

 List<Integer> original;
 List<Integer> selected;

 List<Integer> add = new ArrayList<Integer>(selected);
 add.removeAll(original);

 List<Integer> remove = new ArrayList<Integer>(original);
 remove.removeAll(selected);
Run Code Online (Sandbox Code Playgroud)

注意重复元素周围的边框情况.基数应该得到尊重吗?如果我5, 6原来和5, 5, 6之后,应该添加5?上面的Sets 更好用,因为它们没有重复(加上contains()查找更快,因为它们被它们包含的数据索引).