如何在Java中找到与最大值相关的键

如何在Java中找到与最大值相关的键,java,python,collections,hashmap,Java,Python,Collections,Hashmap,好的,我有 Set<String> s; HashMap<String, Double> hm; 你能提出什么“简洁”的解决方案 过去几个月我一直在使用Python,现在用Java处理所有类型的映射而不是字典是非常不方便的 关于这个问题,我想说的是,在Java中以某种“更智能”的方式简化下面的代码。 import com.google.common.collect.Sets; double maxVal = 0.0; for(String candidate :

好的,我有

Set<String> s;
HashMap<String, Double> hm;
你能提出什么“简洁”的解决方案

过去几个月我一直在使用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

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)

因此,您想检查哈希映射的值,如果它对应于集合中的一个条目,则会将该键和值对添加到压缩哈希映射中

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

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

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

正如我在评论中所说的那样,您可以首先使用
Collections.max(…)
从集合中检索最大值,并使用该值比较
映射中的值

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());
    }
}
Set Set=newhashset(Arrays.asList(10,30,20,10));
int maxValueInSet=Collections.max(set);
Map hashMap=新hashMap(){{
付诸表决(“a”,20);
付诸表决(“b”,30);
付诸表决(“c”,10);
付诸表决(“d”,40);
付诸表决(“e”,30);
}};
for(Map.Entry:hashMap.entrySet()){
if(entry.getValue().equals(maxValueInSet)){
System.out.println(entry.getKey());
}
}
输出:

b

e


正如我在评论中所说,您可以首先使用
Collections.max(…)
从集合中检索最大值,并使用该值比较
映射中的值

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());
    }
}
Set Set=newhashset(Arrays.asList(10,30,20,10));
int maxValueInSet=Collections.max(set);
Map hashMap=新hashMap(){{
付诸表决(“a”,20);
付诸表决(“b”,30);
付诸表决(“c”,10);
付诸表决(“d”,40);
付诸表决(“e”,30);
}};
for(Map.Entry:hashMap.entrySet()){
if(entry.getValue().equals(maxValueInSet)){
System.out.println(entry.getKey());
}
}
输出:

b

e


检查并阅读已接受答案中有关多个最大值的注释values@sam这有点不同,唯一的选项是set
s
中的元素,我愿意看到详细的实现技巧。如果我用pythonic风格编写它,答案将类似于
answer set=getKeysByValue(hm,Collections.max([hm.get(item)for item in s]))
一个可能的解决方案是只在set中找到max值,然后使用该值与中的值进行比较map@sam是的,我就是这么想的。您是否有任何整洁的实现,而不是迭代for循环设置?请检查并阅读关于multiple max的公认答案上的注释values@sam这有点不同,唯一的选项是set
s
中的元素,我愿意看到详细的实现技巧。如果我用pythonic风格编写它,答案将类似于
answer set=getKeysByValue(hm,Collections.max([hm.get(item)for item in s]))
一个可能的解决方案是只在set中找到max值,然后使用该值与中的值进行比较map@sam是的,我就是这么想的。您是否有任何简洁的实现来代替对for循环集合的迭代?我对set的意图是
set set=newhashset(Arrays.asList(“a”、“b”、“e”)@SUNDONG List是字符串,set是整数,无法编译。假设集合是一个整数,你想比较集合中的最大字符串值和映射中的最大键吗?我在原始问题上加了一段,你可能会理解我的意思。@SUNDONG哦,我刚才看到你已经完成了我在回答中所说的。除了你所做的以外,我不知道还有什么别的办法。你可能想把它发布在codereview网站上,在那里你可以得到关于工作代码的反馈我的意图是set
set set=newhashset(Arrays.asList(“a”、“b”、“e”)@SUNDONG List是字符串,set是整数,无法编译。假设集合是一个整数,你想比较集合中的最大字符串值和映射中的最大键吗?我在原始问题上加了一段,你可能会理解我的意思。@SUNDONG哦,我刚才看到你已经完成了我在回答中所说的。除了你所做的以外,我不知道还有什么别的办法。您可能希望将其发布在codereview网站上,在那里您可以获得有关工作代码的反馈