我正试图找到一种有效的方法来返回HashMap
中数据结构中值最低的键。除了循环整个HashMap
之外,还有什么快速有效的方法可以做到这一点吗?
例如,如果我有一个哈希图,它看起来像这样:
1: 200
3: 400
5: 1
我想把钥匙还给你。
否,必须循环遍历HashMap
中的所有键才能找到最小的键。如果这是一个重要的操作,那么最好使用SortedMap
,例如TreeMap
,它将元素按排序顺序排列,然后您可以简单地调用firstKey()
来查找最低键。
正如其他人所提到的,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; }
}
不,没有办法做到这一点。您需要对HashMap中的所有元素进行迭代,以找到值最低的元素。
我们之所以有不同种类的存储,是因为它们以不同的效率支持不同种类的操作。HashMap并不是为了根据元素的值高效地检索元素而设计的。您需要的存储类类型将取决于您需要能够快速执行的其他操作。假设您可能还希望能够根据密钥快速检索项目,那么以下方法可能会起作用:
- 围绕HashMap编写一个包装器,跟踪添加到其中的所有元素,并记住哪一个元素最小。只有当检索smalls是您需要按值访问的唯一方式时,这才真正有用
- 将所有数据存储两次——一次在HashMap中,一次在按值排序的数据结构中——例如,键和值反转的SortedMap
- 如果您发现不需要按关键字检索,只需反转关键字和值即可
不,没有快速有效的方法可以做到这一点——您需要循环整个哈希图。原因是散列映射中的键和值不遵循任何特定的顺序。
否,因为否则O(n log n)中会存在排序算法(不过是概率性的):将所有元素添加到哈希图中,而不是逐个提取最低的元素。
//create hashmap
HashMap<Integer, String> yourHashmap = new HashMap<>();
//add your values here
yourHashmap.put(1,"200");
yourHashmap.put(3,"400");
yourHashmap.put(5,"1");
//then create empty arraylist
ArrayList<Integer> listDuplicates = new ArrayList<Integer>();
//filing the empty arraylist with all id's from duplicateHashmap
for (Map.Entry<Integer, String> entry : yourHashmap.entrySet()) {
listDuplicates.add(entry.getKey());
}
//Ordering the numbers
Collections.sort(listDuplicates);
for (Integer num : listDuplicates) {
int id = num; //entry
String number2 = duplicateHashmap.get(num);//value
System.out.println("lowest value = "+id+" : "+number2);
//breaking here because we've found the lowest value...
break;
}