java8 哈希图排序错误



我有一张地图:

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由多个线程访问,因此它们可能会在排序过程中发生变化,这可能会导致不良结果(甚至异常)。

最新更新