【问题标题】:Use map and filter functions to remove elements from a set which exists in a treemap (Java Collections)使用 map 和 filter 函数从存在于树形图中的集合中删除元素(Java 集合)
【发布时间】:2019-07-04 14:07:37
【问题描述】:

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

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

那么如何解决这个问题?以及如何使用它们?

【问题讨论】:

  • @Carcigenicate classCastException
  • 请在您的问题中发布完整的错误信息
  • @Carcigenicate 这里是完整的错误
  • 您试图从 Set&lt;Integer&gt; 中删除 Entry&lt;Integer, Integer&gt; 项目,这没有任何意义,因此 JVM 正确地抱怨。

标签: java dictionary filter set


【解决方案1】:

您的解决方案的问题是,当它需要 Itterable 时,您将 List&lt;Map.Entry&gt; 传递给 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多