【发布时间】:2016-01-28 06:24:21
【问题描述】:
好的,我有
Set<String> s;
HashMap<String, Double> hm;
而且,我想在hm 中找到与集合中所有可能的键(候选)中的最大值相关的键。
下面的方法是我已经拥有的,它可以帮助我找到关于一个值的多个键。我可能会使用Collections.Max(hm.values()) 来获取最大值
public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
Set<T> keys = new HashSet<T>();
for (Entry<T, E> entry : map.entrySet()) {
if (Objects.equals(value, entry.getValue())) {
keys.add(entry.getKey());
}
}
return keys;
}
您可以建议什么“简洁”的解决方案?
过去几个月我一直在使用 Python,现在处理各种地图而不是 Java 字典非常不方便。
我想对这个问题说一下,在 Java 中以某种“更智能”的方式简化下面的代码。
import com.google.common.collect.Sets;
double maxVal = 0.0;
for(String candidate : s){
if(hm.get(candidate) >= maxVal){
maxVal = hm.get(candidate);
}
}
Set<String> subset = Sets.intersection(set, getKeysByValue(hm, maxVal));
可能的类似 Python 的实现(列表理解)是
subset = set.intersection(s, getKeysByValue(hm, Collections.max([hm.get(item) for item in s]))
【问题讨论】:
-
检查 Finding Key associated with max Value in a Java Map 并阅读有关多个最大值的已接受答案的 cmets
-
@sam 有点不一样,只有选项是 set
s中的元素,我愿意看到详细的实现技巧。如果我以 Python 风格编写,答案将类似于Answer set = getKeysByValue(hm, Collections.max([hm.get(item) for item in s])) -
一种可能的解决方案是在集合中找到最大值,然后使用该值与地图中的值进行比较
-
@sam 是的,我就是这么想的。你有什么简洁的实现,而不是通过 for 循环遍历集合吗?
标签: java python collections hashmap