问题
I have a HashMap of arbitrary objects, with Double values as the value: HashMap<MyObject, Double> myMap = new HashMap<>();. I can get the maximum Double value in the HashMap using Collections.max(myMap.values()); but I need to get the corresponding key for that value. Is there an easy way to do this with the Collections API it or would I need an iterator? I've thought about getting the position of the max value and then querying the HashMap for that position and get the key but I'm not sure how to do that.
EDIT: I can change the type from a HashMap to something else if necessary, but those two types (Object and Double) need to stay the same.
回答1:
Just iterate the entry set looking for the largest value:
Map.Entry<MyObject, Double> maxEntry = null;
for (Map.Entry<MyObject, Double> entry : map.entrySet()) {
if (maxEntry == null || entry.getValue() > maxEntry.getValue()) {
maxEntry = entry;
}
}
MyObject maxKey = maxEntry.getKey(); // Might NPE if map is empty.
or, if you want to get all keys with maximal value:
double maxValue = null;
List<MyObject> maxKeys = new ArrayList<>();
for (Map.Entry<MyObject, Double> entry : map.entrySet()) {
if (maxValue == null || maxValue.equals(entry.getValue())) {
maxValue = entry.getValue();
maxKeys.add(entry.getKey());
} else if (entry.getValue() > maxValue) {
maxValue = entry.getValue();
maxKeys.clear();
maxKeys.add(entry.getKey());
}
}
回答2:
2 things here.
1) There is no way to get your key with Collections framework by giving it's value. You would need an iterator.
2) Telling the same, keys are unique and not values. You have to handle the case of duplicated values.
来源:https://stackoverflow.com/questions/35938842/get-the-key-for-the-maximum-value-in-a-hashmap-using-collections