我有一个列表,其中包含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);
当前我得到一个空列表,因为哈希集正在从列表中删除我的所有项目,但我只希望删除列表中与哈希集匹配的项目,并且如果列表中第二次出现,因为它不会被删除。
答案 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中的项目-这适用于所有情况下的问题情况: