查找其值是散列映射中最低值的键

时间:2013-12-06 22:33:05

标签: java hashmap key min

我正在努力想出一种有效的方法来返回数据结构中值最低的HashMap中的密钥。除了循环整个HashMap之外,还有一种快速有效的方法吗?

例如,如果我有一个如下所示的hashmap:

1: 200
3: 400
5: 1

我想要退回钥匙,5。

5 个答案:

答案 0 :(得分:5)

不,你必须遍历HashMap中的所有键才能找到最小的键。如果这是一项重要操作,您最好使用SortedMap,例如TreeMap,它会按顺序保留其元素,然后您只需调用firstKey()即可找到最低的关键。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

我们拥有不同类型存储的原因是它们支持不同类型的操作,效率不同。 HashMap不能根据其值有效地检索元素。您需要的存储类类型取决于您需要快速执行的其他操作。假设您可能还希望能够根据键快速检索项目,则可能会有以下情况:

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

答案 3 :(得分: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; }
}

答案 4 :(得分:1)

不,因为否则会在O(n log n)中存在排序算法(尽管是概率的):将所有元素添加到哈希映射中,而不是逐个提取最低元素。