java8 Hashmap排序错误

时间:2016-01-29 10:20:27

标签: java hashmap java-8

我有一张地图:

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

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

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 -> System.out.print(e.getKey()));

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:6)

尝试使用:

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

答案 1 :(得分:4)

问题是您尝试使用Map.EntryMap.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。通常,{{1}}由多个线程访问,因此它们可以在排序期间更改,这可能会导致不良结果(例外,甚至)。