如何查找与Java

时间:2015-10-28 12:58:59

标签: java python collections hashmap

好的,我有

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]))

3 个答案:

答案 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)

如果您使用SortedSetTreeSet)代替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>      

ë

Demo