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

Java 如何仅从列表中删除一组项目一次?,java,Java,我有一个列表,其中包含2个哈希集的项。我想找到出现在这两个集合中的项目,我想通过合并这两个集合来实现,然后由于哈希集合不会多次存储同一个值,所以从列表中删除哈希集合项目一次 例如,如果我有一个列表,它是:a 我有一套是:a b 我试图从列表中删除这个集合,我希望结果是:a b 我该怎么做呢 Set<String> setItemsA = new HashSet<String>(); setItemsA.add("a"); setItemsA.add("b"); setIt

我有一个列表,其中包含2个哈希集的项。我想找到出现在这两个集合中的项目,我想通过合并这两个集合来实现,然后由于哈希集合不会多次存储同一个值,所以从列表中删除哈希集合项目一次

例如,如果我有一个列表,它是: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);
Set setItemsA=new HashSet();
setItemsA.添加(“a”);
setItemsA.添加(“b”);
setItemsA.添加(“c”);
setItemsA.添加(“d”);
Set setItemsB=新的HashSet();
setItemsB.添加(“a”);
setItemsB.添加(“b”);
设置项b.添加(“RR”);
Set setItemsC=new HashSet();
List cleanedList=新建ArrayList();
Set mergedList=new HashSet();
cleanedList.addAll(setItemsA);
cleanedList.addAll(setItemsB);
mergedList.addAll(cleanedList);
System.out.println(清除列表);
清除列表.removeAll(合并列表);
System.out.println(清除列表);
当前我得到一个空列表,因为哈希集正在从列表中删除我的所有项目,但我只希望删除列表中与哈希集匹配的项目,如果列表中再次出现,则不删除该项目。

该方法将从提供的集合中删除所有匹配的对象,在本例中,cleanedList中的所有字符串对象都与mergedList匹配,若要进行减法运算,请使用删除列表中的第一个匹配对象

cleanedList --> [a, b, c, d, RR, a, b]
mergedList -->   [RR, a, b, c, d]
以你的减法为例

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

您可以使用lambdas进行以下操作:

setItemsA.stream().filter(item -> setItemsB.contains(item)).collect(Collectors.toList());
上述内容将仅返回setA中发生在setB中的项目-这适用于所有情况下的问题案例:

  • 如果项目存在于A中而不是B中,则不会返回该项目
  • 如果项目存在于B中而不是A中,则不会返回
  • 如果项目存在于A和B中,则将返回该项目

  • 什么是“散列列表?”对不起,我指的是散列集。我想当我写下这个问题时,我忽略了这一点,请考虑行mergedList.addAll(cleanedList);和cleanedList.removeAll(合并列表)。合并列表包含已清理列表中的所有项目,并且您正在从已清理列表中清理合并列表中的项目,该列表绑定为空。是。但我要做的是使每个匹配项只删除一次。我不知道该怎么做。我本以为这也会起作用,好问题。