我的项目中有2个ArrayList。我想得到不相等的物品。
例如:
列表1-列表2
AB ------- AB
BA ------- BA
CC
我想得到这个CC。我是这样的:
ArrayList<String> alllist= new ArrayList<>(ArrayList<String> 1);
for (String i : ArrayList<String> 1) {
for (String j : ArrayList<String> 2) {
if (i.equals(j)) {
alllist.remove(i);
break;
}
}
}
如果我在ArrayList中有3或4个项目,则可以使用此方法,但是当我添加200个项目时,此方法将无法正常工作并得到错误的列表。
有什么主意吗?我还能做些什么?
非常感谢。
答案 0 :(得分:2)
如果我正确理解了您的问题,那么您正在寻找symmetric difference。您可以使用Apache Commons Collections中的CollectionUtils.disjunction
给出:
List<String> list1 = Arrays.asList("AB", "BA", "DD");
List<String> list2 = Arrays.asList("AB", "BA", "CC");
操作:
System.out.println(CollectionUtils.disjunction(list1, list2));
结果:
[DD, CC]
答案 1 :(得分:1)
如果您需要列表1中的所有内容,但不需要列表2
1)遍历第一个列表,并将每个元素添加到HashSet中。
2)使用set.removeAll(list2)删除列表2中的所有内容。
其余的是list1而不是list2。
如果您需要将所有内容都放在另一个列表中而不是另一个列表中,则可以反向重复。这应该将操作反转为O(n + m),其中n是列表1的长度,m是列表2的长度。您的伪代码是O(n * m)。
HashSet firstButNotSecond = new HashSet(list1);
firstButNotSecond.removeAll(list2);
HashSet secondButNotFirst = new HashSet(list2);
secondButNotFirst.removeAll(list1);
答案 2 :(得分:0)
ArrayList<String> list2 = new ArrayList();
list2.add("AB");
list2.add("BA");
ArrayList<String> list1 = new ArrayList();
list1.add("AB");
list1.add("BA");
list1.add("C");
//remove all the element from the list1 which are also in list2
list1.removeAll(list2);
System.out.println("Result: " + list1); //only C will left behind