如何比较java中的两个数组并返回一个未包含在两个列表中的元素

时间:2017-06-14 14:49:45

标签: java arrays

我需要提供一个Java解决方案,给出两个列表,a& b,返回一个列表中但不存在于另一个列表中的值。

e.g。 列出a = [26, 13, 88, 9]

列出b = [26, 1, 8, 12]

4 个答案:

答案 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中,您的值只会出现在其中一个列表中。