好的,我有
Set<String> s;
HashMap<String, Double> hm;
而且,我想在hm
中找到与集合中所有可能的密钥(候选)s中的最大值相关的密钥。
下面的方法是我已经拥有的,这有助于我找到关于一个值的多个键。我可以使用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]))
答案 0 :(得分:0)
因此,您要检查哈希映射的值,以及它是否与您的密钥组中的条目相对应。然后将值对添加到压缩哈希映射中?
在Python中
def get_matching_values(my_set, my_dict):
new_dict = {}
for key, value in my_dict.iteritems():
if value in my_set:
new_dict[key] = value
return new_dict
或作为词典理解
def get_matching_values(my_set, my_dict):
return dict((key, value) for key, value in my_dict.iteritems() if value in my_set)
答案 1 :(得分:0)
如果您使用SortedSet
(TreeSet
)代替Set
,则可以致电SortedSet.last()
以获取最大值。
答案 2 :(得分:0)
正如我在评论中所说,您可以先使用Collections.max(...)
从集合中检索最大值,然后使用该值来比较map
Set<Integer> set = new HashSet<Integer>(Arrays.asList(10,30,20,10));
int maxValueInSet = Collections.max(set);
Map<String, Integer> hashMap = new HashMap<String, Integer>() {{
put("a", 20);
put("b", 30);
put("c", 10);
put("d", 40);
put("e", 30);
}};
for (Map.Entry<String, Integer> entry: hashMap.entrySet()) {
if (entry.getValue().equals(maxValueInSet)) {
System.out.println(entry.getKey());
}
}
输出:
B'/ P>
ë