如何仅从列表中删除一组项目?

时间:2018-11-06 03:55:24

标签: java

我有一个列表,其中包含2个HashSet项。我想找到出现在两个集合中的项目,并希望通过合并两个集合来做到这一点,然后由于哈希集不会多次存储相同的值,因此请从列表中删除一次hashSet项。

例如,如果我有一个列表是:a b b a

我有一个是:a b

我试图从列表中删除该集合,我希望结果是:a b

我该怎么做?

Set<String> setItemsA = new HashSet<String>();
setItemsA.add("a");
setItemsA.add("b");
setItemsA.add("c");
setItemsA.add("d");

Set<String> setItemsB = new HashSet<String>();
setItemsB.add("a");
setItemsB.add("b");
setItemsB.add("RR");

Set<String> setItemsC = new HashSet<String>();
List<String> cleanedList = new ArrayList<>();
Set<String> mergedList = new HashSet<String>();
cleanedList.addAll(setItemsA);
cleanedList.addAll(setItemsB);
mergedList.addAll(cleanedList);

System.out.println(cleanedList);
cleanedList.removeAll(mergedList);
System.out.println(cleanedList);

当前我得到一个空列表,因为哈希集正在从列表中删除我的所有项目,但我只希望删除列表中与哈希集匹配的项目,并且如果列表中第二次出现,因为它不会被删除。

2 个答案:

答案 0 :(得分:2)

removeAll()方法将从提供的集合中删除所有匹配的对象,在这种情况下,cleanedList中的所有String对象都与mergedList匹配,如果要减法,请使用remove()来删除其中的第一个匹配对象。列表

cleanedList --> [a, b, c, d, RR, a, b]
mergedList -->   [RR, a, b, c, d]

您要减法的情况

for(String s:mergedList) {
            cleanedList.remove(s);
        }
  cleanedList --> [a, b]

答案 1 :(得分:0)

您可以为此使用lambda:

setItemsA.stream().filter(item -> setItemsB.contains(item)).collect(Collectors.toList());

然后,上述方法仅返回setA中出现在setB中的项目-这适用于所有情况下的问题情况:

  1. 如果该项目存在于A中而不是B中,则不会返回
  2. 如果该项目存在于B中而不是A中,则不会返回
  3. 如果该项目存在于A和B中,则将被退回