我有两个ArrayList<Integer>如下:
原版的: 12, 16, 17, 19, 101
选择: 16, 19, 107, 108, 109
我想在这些列表上做交集/联合,最后我有两个列表:
加: 108,109,107
去掉: 12, 17, 101
原始列表和所选列表的长度各不相同,一个可以比另一个更大/更小
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.
使用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)
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()查找更快,因为它们被它们包含的数据索引).