【问题标题】:How to find keys related to maximum value in Java如何在Java中找到与最大值相关的键
【发布时间】: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


【解决方案1】:

正如我在 cmets 中所说,您可以先使用 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

e

Demo

【讨论】:

  • 我的设置意图是Set&lt;Integer&gt; set = new HashSet&lt;Integer&gt;(Arrays.asList("a", "b", "e"));
  • @SUNDONG List 是字符串,set 是不会编译的整数。假设 set 是一个整数,是否要将 set 中的最大字符串值与 map 中的最大键进行比较?
  • 我在我原来的问题上加了一段,那你可能明白我的意思了。
  • @SUNDONG 哦,我刚刚看到你已经按照我在答案中所说的做了。除了您所做的之外,我不知道有任何其他方法可以做。您可能希望将其发布在 codereview 网站上,在那里您可以获得有关工作代码的反馈
【解决方案2】:

如果您使用SortedSet (TreeSet) 而不是Set,您可以调用SortedSet.last() 来获取最大值。

【讨论】:

    【解决方案3】:

    所以你想检查你的哈希映射的值,如果它对应于你集合中的一个条目,那么键和值对就会被添加到你的压缩哈希映射中?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多