【问题标题】:HashMap Sort By Value of AtomicIntegerHashMap 按 AtomicInteger 的值排序
【发布时间】:2025-12-17 19:45:01
【问题描述】:

我有 HashMap 并尝试按值倒序排序,我下面的代码按升序工作,

LinkedHashMap<String, AtomicInteger> collect = counterMap.entrySet()
                .stream()
                .sorted(Comparator.comparingInt(a -> a.getValue().get()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

不幸的是,我不能在 sorted 方法中使用 reverseOrder()。

欢迎任何建议或想法。谢谢!

【问题讨论】:

  • “我不能在 sorted 方法中使用 reverseOrder()”为什么?
  • 使用这个技巧...sorted(Comparator.comparingInt(a -&gt; a.getValue().get()*-1))
  • @AndrewTobilko 编译器向我抛出“无法解析方法 getValue()”错误。 Hadi J 的 hack 效果很好,而且很棒。谢谢哈迪 J. :-)
  • @parrotjack 这不是真棒;)当有专门设计的方法时:reversed()。看看我的回答
  • @HadiJ 除了x * -1-x 的冗长变体这一事实之外,这是一个失败的解决方案,就像Integer.MIN_VALUE 一样,它不会 这样做正确的事情。由于这是一个特殊的稀有值,因此此类代码可能会通过所有测试,但会在生产环境中突然产生难以重现的错误。

标签: java lambda java-8 java-stream comparator


【解决方案1】:

您需要帮助编译器解析泛型类型。

Comparator.<Map.Entry<String, AtomicInteger>>comparingInt(a -> a.getValue().get())
          .reversed()

否则,它假定aObject,而a.getValue() 将无法编译。

This answer of mine我前几天给的密切相关。

【讨论】:

  • Collections.reverseOrder(Comparator.comparingInt(a -&gt; a.getValue().get()))