在哈希映射中找到最大值对应的键

Posted

技术标签:

【中文标题】在哈希映射中找到最大值对应的键【英文标题】:Finding the key corresponding to the maximum value in a hash map 【发布时间】:2020-11-29 21:22:29 【问题描述】:

我正在尝试在 HashMap 中找到对应于最大值的键。我的声明如下:

HashMap<Node, Double> coinD= new HashMap<>();

但是,当我尝试使用匿名函数来比较此映射的 entrySet 内的两个值时,我收到类型转换错误:

Node bestNode = Collections.max(coinD.entrySet(), (e1, e2) -> e1.getValue() - e2.getValue()).getKey();

在 e1.getValue() 和 e2.getValue() 上返回类型不匹配:无法从 double 转换为 int。这是从哪里来的?为什么这里需要一个整数;为什么函数不能使用双精度进行比较?我定义的函数是否需要整数,或者 .getValue() 是否必须返回一个整数?任何帮助将不胜感激!

【问题讨论】:

如果你的值是Double-typed,你不能使用d1-d2,因为它返回的doubleint的返回类型Comparator.compare不兼容。试试.max(coinD.entrySet(), Map.Entry.comparingByValue()).max(coinD.entrySet(), (e1,e2)-&gt;Double.compare(e1,e2)) 【参考方案1】:

您正在尝试将一个应该实现 Comparable 的 lambda 作为参数传递给 max,但 Comparable 必须返回一个 int,而您正在生成一个 double作为从另一个中减去一个 double 的结果。

您可以通过使用Double.compare(e1.getValue(), e2.getValue()) 而不是减去这两个值来轻松解决此问题:

 Node bestNode = Collections.max(coinD.entrySet(), 
        (e1, e2) -> Double.compare(e1.getValue(), e2.getValue())).getKey();

@ernest_k 也有一个好处:如果您的地图的值具有自然排序顺序,并且您想使用该顺序,Map.Entry.comparingByValue 会产生稍微短一些的代码:

 Node bestNode = Collections.max(coinD.entrySet(), 
        (e1, e2) -> Map.Entry.comparingByValue()).getKey();

【讨论】:

感谢您的回答 - 只是为了澄清一下,“自然排序顺序”会构成什么? @rjc810 - 看看What is natural ordering when we talk about sorting? - 这可能会有所帮助。

以上是关于在哈希映射中找到最大值对应的键的主要内容,如果未能解决你的问题,请参考以下文章

如何返回总和小于最大值的键的哈希对?

Java 8 流映射到按值排序的键列表

PHP怎么搜索数组的键并查找到对应的值?

706.设计哈希映射

HashMapHashTableConcurrentHashMap详解

如何在哈希表中均匀分布不同的键?