繁体   English   中英

使用地图和过滤器功能从树图中存在的集合中删除元素(Java集合)

[英]Use map and filter functions to remove elements from a set which exists in a treemap (Java Collections)

如何使用过滤器功能从像这样的树图中存在的集合中删除元素

TreeSet<Integer> set = new TreeSet<>();  
TreeMap<Integer, Integer> map = new TreeMap<>();    
set.removeAll(map.entrySet().stream()
       .filter(x -> x.getValue()>1).collect(Collectors.toList())) ; 

当我运行它时,它给了我

Exception in thread "main" java.lang.ClassCastException: java.util.TreeMap$Entry cannot be cast to java.lang.Comparable
    at java.util.TreeMap.getEntry(Unknown Source)
    at java.util.TreeMap.remove(Unknown Source)
    at java.util.TreeSet.remove(Unknown Source)
    at java.util.AbstractSet.removeAll(Unknown Source)
    at Main.main

那么如何解决呢? 以及如何使用它们?

解决方案的问题是,当您期望List<Map.Entry>传递给Itterable时,将它传递给TreeSet::removeAll

set.removeAll(map.entrySet().stream()
    .filter(x -> x.getValue() > 1)
    .collect(Collectors.toList()));

您要做的就是将每个过滤后的项目映射到一个integer然后收集它们。

set.removeAll(map.entrySet().stream()
    .filter(x -> x.getValue() > 1)
    .map(Map.Entry::getValue) // get the value itself and collect those instead.
    .collect(Collectors.toList()));

这是执行的测试:

TreeSet<Integer> set = new TreeSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));

TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>() {{ 
    put(1, 1); put(2, 2); put(3, 3);
}};

set.removeAll(map.entrySet().stream()
    .filter(x -> x.getValue() > 1)
    .map(Map.Entry::getValue)
    .collect(Collectors.toList()));

System.out.println(set); // prints [1, 4, 5, 6, 7]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM