代码有什么问题?我没有得到任何输出值。但它应该打印重复的值。 (a
是Arraylist
)
HashSet<Integer> hs=new HashSet();
hs.addAll(a);
List<Integer> b=new ArrayList();
a.removeAll(hs);
System.out.println(a);
答案 0 :(得分:0)
我怀疑你认为a.removeAll(hs);
最多删除一个元素一次。事实并非如此。作为the docs州:
[...]此调用返回后,此集合将不包含与指定集合
共同的元素
这意味着,即使hs.addAll(a);
会导致包含可能少于a
的值的Set(缺少重复项),调用a.removeAll(hs)
仍会删除所有原始值以及重复。
removeAll
的源代码会验证在a
上进行迭代并检查a
中的hs
元素是否在a
中,并将其从{{1}中移除如果是这样的话。它不会迭代hs
并删除a
的匹配元素。 Source grepcode
答案 1 :(得分:0)
您可以使用的是removeIf
:
List<Integer> a = new ArrayList<>(Arrays.asList(1,1,1,1,1,1,2,2,3,3,4,5,6,6,7));
Map<Integer, List<Integer>> counter = a.stream().collect(Collectors.groupingBy(i -> i));
a.removeIf(v -> counter.get(v).size() == 1);
System.out.println(new HashSet<Integer>(a)); //[1, 2, 3, 6]