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

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

 List pinklist = t2.getList(); List normallist = t.getList(); ArrayList duplicatevalues = new ArrayList(); ArrayList uniquevalues = new ArrayList(); for (String finalval : pinklist) { if (pinklist.contains(normallist)) { duplicatevalues.add(finalval); } else if (!normallist.contains(pinklist)) { uniquevalues.add(finalval); } } 

我正在正确获取duplicateValues ,但我没有获得唯一值。

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

你可以这样做:

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

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

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

这应该做:

 List pinklist = t2.getList(); List normallist = t.getList(); ArrayList duplicates = new ArrayList(normallist); dublicates.retainAll(pinklist); ArrayList uniques = new ArrayList(normallist); uniques.removeAll(pinklist); 

阐释:

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

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

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

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

这样做 –

 for (String finalval : pinklist) { if(normallist.contains(finalval)) { // finalval is both in pinklist and in // normallist. Add it as a duplicate. duplicatevalues.add(finalval); // this will get you the duplicate values } else { // finalval is in pinklist but not in // normallist. Add it as unique. uniquevalues.add(finalval); // this will get you the values which are in // pinklist but not in normallist } } // This will give you the values which are // in normallist but not in pinklist. for(String value : normallist) { if(!pinklist.contains(value)) { uniquevalues.add(value); } } 

为什么要将整个列表传递给contains方法? 你应该通过finalval