我有一张地图:
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 -> System.out.print(e.getKey()));
我的代码有什么问题?
尝试使用:
Stream<Map.Entry<K,V>> keywordMap = keywordMap.entrySet().stream().sorted(Map.Entry.comparingByValue());
问题是您尝试使用 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
由多个线程访问,因此它们可能会在排序过程中发生变化,这可能会导致不良结果(甚至异常)。