3

如图所示,我有两个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);
    }
}

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

4

7 回答 7

17

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

你可以这样做:

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

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

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

于 2012-12-05T07:54:29.150 回答
17

这应该这样做:

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);  

解释:

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

  • retainAll(list2)将删除所有不存在于list2.

  • removeAll(list2)将删除所有条目,确实存在于list2.

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

于 2012-12-05T07:56:40.793 回答
1

试试 ListUtils https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/ListUtils.html

要获取重复值,请使用 ListUtils.intersection(list1, list2) 要获取唯一值,您可以使用 ListUtils.sum(list1, list2) 然后减去重复列表

于 2019-03-14T09:10:06.110 回答
0

这样做——

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);
    }
}
于 2012-12-05T07:55:10.610 回答
0

使用 Java8 Stream API,我们可以过滤列表并获得预期的结果。

List<String> listOne = // Your list1
List<String> listTwo = // Your list2

List<String> uniqueElementsFromBothList = new ArrayList<>();
List<String> commonElementsFromBothList = new ArrayList<>();

// Duplicate/Common elements from both lists
commonElementsFromBothList.addAll(
         listOne.stream()
        .filter(str -> listTwo.contains(str))
        .collect(Collectors.toList()));

// Unique element from listOne
uniqueElementsFromBothList.addAll(
         listOne.stream()
        .filter(str -> !listTwo.contains(str))
        .collect(Collectors.toList())); 

// Unique element from listOne and listTwo 
// Here adding unique elements of listTwo in existing unique elements list (i.e. unique from listOne)
uniqueElementsFromBothList.addAll(
         listTwo.stream()
        .filter(str -> !listOne.contains(str))
        .collect(Collectors.toList()));
于 2019-03-12T14:49:14.423 回答
0

这是我对问题的解决方案。我们可以创建一个包含两个列表中元素的集合。

对于唯一元素,使用 Stream API,我们可以根据返回contains方法 XOR 的谓词过滤掉元素。它只会为true ^ falseOR返回 true false ^ true,确保其中只有一个包含它。

对于不同的元素,只需将 XOR 更改为&&,它将检查两个列表是否都有对象。

代码:

private static void uniqueAndDuplicateElements(List<String> a, List<String> b) {
    Set<String> containsAll = new HashSet<String>();
    containsAll.addAll(a);
    containsAll.addAll(b);

    List<String> uniquevalues = containsAll.stream()
                                .filter(str -> a.contains(str) ^ b.contains(str))
                                .collect(Collectors.toList());
        
    List<String> duplicatevalues = containsAll.stream()
                                   .filter(str -> a.contains(str) && b.contains(str))
                                   .collect(Collectors.toList());

    System.out.println("Unique elements from both lists: " + uniquevalues);
    System.out.println("Elements present in both lists: " + duplicatevalues);
}
于 2020-09-02T05:40:05.893 回答
-1

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

于 2012-12-05T08:00:18.507 回答