【问题标题】:java8 Hashmap sort error [duplicate]java8 Hashmap排序错误[重复]
【发布时间】:2016-01-29 10:20:27
【问题描述】:

我有一张地图:

private Map<String, AtomicInteger> keywordMap = new HashMap<String, AtomicInteger>();

我正在尝试使用以下代码在 Java 8 中按值 (AtomicInteger) 对 Map 进行排序:

keywordMap
        .entrySet()
        .parallelStream()
        .sorted().forEachOrdered(e -> System.out.print(e.getKey()));

但是,我收到以下错误:

java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to java.lang.Comparable

错误出现在这一行:.forEachOrdered(e -&gt; System.out.print(e.getKey()));

我的代码有什么问题?

【问题讨论】:

标签: java hashmap java-8


【解决方案1】:

尝试使用:

Stream<Map.Entry<K,V>> keywordMap = keywordMap.entrySet().stream().sorted(Map.Entry.comparingByValue());

【讨论】:

  • 我在 sorted(Map.Entry.comparingByValue()) 中遇到编译错误;
【解决方案2】:

问题是您尝试使用sorted()Map.Entry 实例流进行排序。 Map.Entry 没有实现Comparable 接口,这就是你得到ClassCastException 的原因。所以你必须自己提供一个合适的比较器。

另外,AtomicInteger 没有实现Comparable,这就是你不能使用Map.Entry.comparingByValue() 的原因。您确实必须编写自己的比较器:

keywordMap.entrySet()
    .parallelStream()
    .sorted((a,b) -> Integer.compare(a.getValue().get(), b.getValue().get())); 

但是,AtomicInteger 没有实现 Comparable 是有原因的。通常,AtomicIntegers 由多个线程访问,因此它们可能会在排序过程中发生变化,这可能会导致不良结果(甚至异常)。

【讨论】:

  • .sorted(Comparator.comparingInt( e -&gt; e.getValue().get() ))
  • 对于未来的读者...使用字符串而不是 int。 .sorted((a,b) -> a.compareTo(b)) 或 .sorted((a,b) -> a.compareToIgnoreCase(b))
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2013-05-27
  • 2018-01-19
  • 2016-08-13
相关资源
最近更新 更多