【问题标题】:Finding the key whose value is the lowest value in a hashmap查找值是哈希图中最小值的键
【发布时间】:2013-12-24 10:40:38
【问题描述】:

我试图想出一种有效的方法来返回我的HashMap 中数据结构中具有最低值的键。除了遍历整个 HashMap 之外,还有没有一种快速有效的方法来做到这一点?

例如,如果我有一个如下所示的哈希图:

1: 200
3: 400
5: 1

我想归还钥匙,5。

【问题讨论】:

  • “最低值”是什么意思?
  • 您需要进一步编辑它,Java 中的 HashMap 的格式为 new HashMap<keytype, valuetype>()。你的意思是它是一个 HashMap`?如果是这样,HashMap 可能不是您想要使用的数据结构。
  • @Mike'Pomax'Kamermans 你的意思是如果是Integer -> Integer 地图,OP 不应该使用HashMap?为什么?
  • 我的意思是他们可能没有使用最佳数据结构,特别是如果他们还需要搜索关键空间。没有额外的信息,不以一种或另一种方式承诺。

标签: java hashmap key min


【解决方案1】:

不,您必须遍历 HashMap 中的所有键才能找到最小的。如果这是一个重要的操作,你最好使用SortedMap,例如TreeMap,它保持其元素排序,然后你可以简单地调用firstKey()来查找最低的键。

【讨论】:

  • OP 想要 value 最低的键,而不是最低的键值。
  • 他要求的是最低值,而不是密钥。
  • @maba:你是对的。我想要具有最低值的键。
【解决方案2】:

正如其他人提到的,HashMap 本身不提供此功能。

因此,您的选择是按需计算或预先计算。

要按需计算它,您将迭代 HashMap.entrySet()

根据地图的大小、更改频率和需要key-with-lowest-value 的频率,预计算(缓存)可能更有效。如下:

class HashMapWithLowestValueCached<K, V extends Comparable> extends HashMap<K, V> {    
    V lowestValue;
    K lowestValueKey;    
    void put(K k, V v) {
      if (v.compareTo(lowestValue) < 0) {
        lowestValue = v; 
        lowestValueKey = k;
      }
      super.put(k, v);
    }
    K lowestValueKey () { return lowestValueKey; }
}

【讨论】:

    【解决方案3】:

    不,没有办法做到这一点。您需要遍历 HashMap 中的所有元素以找到具有最低值的元素。

    之所以有不同类型的存储,是因为它们支持不同类型的操作,效率不同。 HashMap 并非旨在根据元素的值有效地检索元素。为此所需的存储类类型将取决于您需要能够快速完成的其他操作。假设您可能还希望能够根据它们的键快速检索项目,以下可能会起作用:

    1. 围绕您的 HashMap 编写一个包装器,以跟踪添加到其中的所有元素,并记住哪个是最小的。仅当检索小项是您需要按值访问的唯一方式时,这才真正有用。
    2. 将所有数据存储两次 - 一次在 HashMap 中,一次在按值排序的数据结构中 - 例如,键和值颠倒的 SortedMap。
    3. 如果发现不需要按键检索,只需反转键值即可。

    【讨论】:

      【解决方案4】:

      不,没有快速有效的方法 - 您需要遍历整个哈希映射。原因是哈希映射中的键和值不遵守任何特定的顺序。

      【讨论】:

      • 正如其他一些答案中提到的,OP 正在寻找具有最低值的键,而不是最低键。
      【解决方案5】:

      不,否则将存在 O(n log n) 中的排序算法(虽然是概率性的):将所有元素添加到哈希映射中,而不是一个一个地提取最低的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-20
        • 2019-12-06
        • 2012-10-11
        • 2014-08-03
        • 1970-01-01
        • 2011-08-27
        • 2014-04-19
        • 1970-01-01
        相关资源
        最近更新 更多