比较两个ArrayLists以获取唯一值和重复值

Paw*_*wan 3 java

我有两个ArrayLists如图所示 - pinklistnormallist.我正在比较它们并从两者中找到唯一和重复的值,如下面的代码所示:

List<String> pinklist = t2.getList();
List<String> normallist = t.getList();
ArrayList<String> duplicatevalues = new ArrayList<String>();
ArrayList<String> uniquevalues = new ArrayList<String>();

for (String finalval : pinklist) {
    if (pinklist.contains(normallist)) {
        duplicatevalues.add(finalval);
    } else if (!normallist.contains(pinklist)) {
        uniquevalues.add(finalval);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了duplicateValues正确的,但我没有得到独特的价值观.

Jon*_*eet 15

finalval在条件中忽略了,而是询问一个列表是否包含另一个列表.

你可以这样做:

// Variable names edited for readability
for (String item : pinkList) {
    if (normalList.contains(item)) {
        duplicateList.add(item);
    } else {
        uniqueList.add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不会真的称这些"独特"或"重复"的项目 - 这些通常是关于一个集合中的项目.这只是测试一个列表中的每个项目是否在另一个列表中.我会说,在这种情况下,它更像是"现有的"和"新的".

请注意,当您以基于集合的方式处理这些时,我建议使用集合实现,HashSet<E>而不是列表.Guava中Sets类提供了使用集合的有用方法.


Mor*_*hai 15

这应该做:

List<String> pinklist = t2.getList();
List<String> normallist = t.getList();

ArrayList<String> duplicates = new ArrayList<String>(normallist);
duplicates.retainAll(pinklist);

ArrayList<String> uniques = new ArrayList<String>(normallist);
uniques.removeAll(pinklist);  
Run Code Online (Sandbox Code Playgroud)

阐释:

  • 每个人都List可以将另一个列表作为构造函数参数,并复制它的值.

  • retainAll(list2)将删除所有不存在的条目list2.

  • removeAll(list2)将删除所有存在的条目list2.

  • 我们不想删除/保留原始列表,因为这将修改它,因此我们在构造函数中复制它们.