我需要提供一个Java解决方案,给出两个列表,a& b,返回一个列表中但不存在于另一个列表中的值。
e.g。
列出a = [26, 13, 88, 9]
列出b = [26, 1, 8, 12]
答案 0 :(得分:6)
对于那种操作,最好使用集合, 方法removeAll()将从doc:
过滤数据容器从此列表中删除其中包含的所有元素 指定集合(可选操作)。
List<Integer> myVarListA = Arrays.asList(26, 13, 88, 9);
List<Integer> myVarListB = Arrays.asList(26, 1, 8, 12);
List<Integer> myVarListAcomplementB = new ArrayList<>(myVarListA);
List<Integer> myVarListBcomplementA = new ArrayList<>(myVarListB);
myVarListAcomplementB.removeAll(myVarListB);
myVarListBcomplementA.removeAll(myVarListA);
System.out.println("elements in A but no in B: " + myVarListAcomplementB);
System.out.println("elements in B but no in A: " + myVarListBcomplementA);
myVarListBcomplementA.addAll(myVarListAcomplementB);
System.out.println("both together: " + myVarListBcomplementA);
答案 1 :(得分:1)
简单的解决方案是计算交集并从所需列表中删除它。如果您只想要缺少的东西,可以通过ΦXocę웃Пepeúpaツ等解决方案来优化这一点。
此解决方案的优点在于您可以轻松扩展此功能以使用3个以上的设置/列表。您也可以使用AI(A,I(B,C))来查找A,B和C之间的公共集中缺少的A。而不是AB = diff或AI(A,B)= diff。
public static <T> HashSet<T> intersection(Collection<T> a, Collection<T> b) {
HashSet<T> aMinusB = new HashSet<>(a);
aMinusB.removeAll(b);
HashSet<T> common = new HashSet<>(a);
common.removeAll(aMinusB);
return common;
}
让我们调用交集Collection I = intersection(a,b);
。
现在,如果你想找到B中列表A中缺少的东西:
new LinkedList(A).removeAll(I);//ordered and possibly containing duplicates
OR
new ArrayList(A).removeAll(I);//ordered and possibly containing duplicates. Faster copy time, but slower to remove elements. Experiment with this and LinkedList for speed.
OR
new LinkedHashSet<T>(a).removeAll(I);//ordered and unique
OR
new HashSet<T>(a).removeAll(I);//unique and no order
此外,这个问题实际上与How to do union, intersect, difference and reverse data in java
重复答案 2 :(得分:0)
你可以试试这个:
TIMESTAMP
答案 3 :(得分:0)
只需解析第二个列表并将唯一元素添加到第一个列表中,然后删除其他元素。
for (Integer elem : secondList)
if (firstList.contains(elem))
firstList.remove(elem);
else
firstList.add(elem);
在firstList
中,您的值只会出现在其中一个列表中。