如何从两个数组列表中删除共同的值

25

如何从两个ArrayList中删除相同的值?

让我们考虑下面展示的两个Arraylist:

ArrayList1 = [1,2,3,4]
ArrayList1 = [2,3,4,6,7]

I would like to have result as:

ArrayListFinal = [1,6,7]

我该怎么做呢?


6
试一试,然后我们会帮助你。 - Sotirios Delimanolis
所以您想要删除共同元素。 - SRy
2
提示:如果您阅读List的API,您将自己解决问题。 - Sanchit
如果你至少使用谷歌搜索一下,就可以轻松地找到这个问题的答案。 - Dungeon Hunter
1
可能是两个列表中的共同元素的重复问题。 - assylias
显示剩余2条评论
4个回答

47

以下是完成任务的算法:

  • 构造两个数组的并集
  • 构造两个数组的交集
  • 从并集中减去交集,获得结果

Java集合支持 addAll, removeAllretainAll方法. 使用addAll来构建并集,retainAll构建交集,并使用removeAll 来做减法. 示例见这里:

// Make the two lists
List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list2 = Arrays.asList(2, 3, 4, 6, 7);
// Prepare a union
List<Integer> union = new ArrayList<Integer>(list1);
union.addAll(list2);
// Prepare an intersection
List<Integer> intersection = new ArrayList<Integer>(list1);
intersection.retainAll(list2);
// Subtract the intersection from the union
union.removeAll(intersection);
// Print the result
for (Integer n : union) {
    System.out.println(n);
}

请注意:为使其正常工作,您需要@override equals()。 - Gewure

22

你实际上是在询问 对称差

List<Integer> aList = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
List<Integer> bList = new ArrayList<>(Arrays.asList(2, 3, 4, 6, 7));
// Union is all from both lists.
List<Integer> union = new ArrayList(aList);
union.addAll(bList);
// Intersection is only those in both.
List<Integer> intersection = new ArrayList(aList);
intersection.retainAll(bList);
// Symmetric difference is all except those in both.    
List<Integer> symmetricDifference = new ArrayList(union);
symmetricDifference.removeAll(intersection);

System.out.println("aList: " + aList);
System.out.println("bList: " + bList);
System.out.println("union: " + union);
System.out.println("intersection: " + intersection);
System.out.println("**symmetricDifference: " + symmetricDifference+"**");

输出:

aList: [1, 2, 3, 4]
bList: [2, 3, 4, 6, 7]
union: [1, 2, 3, 4, 2, 3, 4, 6, 7]
intersection: [2, 3, 4]
**symmetricDifference: [1, 6, 7]**

@OldCurmudgeon 如果我想要像[1, 2, 3, 4,6,7]这样的输出,我该怎么做? - KK_07k11A0585
1
@KK_07k11A0585 - 这是“对称差集”和“交集”的“并集”。 - OldCurmudgeon
我只想让顺序保持不变。我得到的是[2.3,4,1,6,7]或[1,6,7,2,3,4]。我应用的逻辑如下:(aList - intersection) + (bList - intersection)。它可以工作[1,2,3,4,6,7]。谢谢 :) - KK_07k11A0585

4
您可以像这样使用:

您可以使用如下代码:

ArrayList <Integer> first = new ArrayList <Integer> ();
ArrayList <Integer> second = new ArrayList <Integer> ();
ArrayList <Integer> finalResult = new ArrayList <Integer> ();

first.add(1);
first.add(2);
first.add(3);
first.add(4);

second.add(2);
second.add(3);
second.add(4);
second.add(6);
second.add(7);

for (int i = 0; i < first.size(); i++){

    if (!second.contains(first.get(i))){

        finalResult.add(first.get(i));
    }
}


for (int j = 0; j < second.size(); j++){

    if (!first.contains(second.get(j))){

        finalResult.add(second.get(j));
    }

}

我按照你在帖子中描述的方式填充了两个ArrayList,并检查了两者是否存在不同的元素;如果找到这样的元素,我就将它们添加到finalResult ArrayList中。


0
SetList<Integer> A = new SetList<Integer>();
A.addAll({1,2,3,4});

SetList<Integer> B = new SetList<Integer>();
B.addAll({2,3,4,6,7});

Integer a = null;

for (int i=0; i<A.size(); i++)
{
    a = A.get(i);

    if (B.contains(a)
    {
        B.remove(a);
        A.remove(a);
        i--;
    }
}

SetList<Integer> final = new SetList<Integer>();
final.addAll(A);
final.addAll(B);

// final = { 1, 6, 7 }

需要解释一下。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接