我有一张地图:
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()));
我的代码出了什么问题?
答案 0 :(得分:6)
尝试使用:
Stream<Map.Entry<K,V>> keywordMap = keywordMap.entrySet().stream().sorted(Map.Entry.comparingByValue());
答案 1 :(得分:4)
问题是您尝试使用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
。通常,{{1}}由多个线程访问,因此它们可以在排序期间更改,这可能会导致不良结果(例外,甚至)。