在Java地图中查找与最大值关联的密钥

在地图中获取与最大值关联的关键字的最简单方法是什么?

我相信Collections.max(someMap)会返回最大的密钥,当你想要的密钥对应的最大值。

基本上你需要迭代地图的入口集,记住“当前已知最大值”和与之关联的关键字。 (当然,也可以只是包含两者的条目)。

例如:

Map.Entry<Foo, Bar> maxEntry = null; for (Map.Entry<Foo, Bar> entry : map.entrySet()) { if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) { maxEntry = entry; } } 

为了完整起见,这里是一个Java 8的方法

 countMap.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey(); 

要么

 Collections.max(countMap.entrySet(), (entry1, entry2) -> entry1.getValue() - entry2.getValue()).getKey(); 

这段代码将打印所有最大值的键

 public class NewClass4 { public static void main(String[] args) { HashMap<Integer,Integer>map=new HashMap<Integer, Integer>(); map.put(1, 50); map.put(2, 60); map.put(3, 30); map.put(4, 60); map.put(5, 60); int maxValueInMap=(Collections.max(map.values())); // This will return max value in the Hashmap for (Entry<Integer, Integer> entry : map.entrySet()) { // Itrate through hashmap if (entry.getValue()==maxValueInMap) { System.out.println(entry.getKey()); // Print the key with max value } } } } 

一个简单的使用Java-8的class轮

 Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey(); 

下面是通过定义适当的Comparator直接执行(没有明确的额外循环):

 int keyOfMaxValue = Collections.max( yourMap.entrySet(), new Comparator<Entry<Double,Integer>>(){ @Override public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) { return o1.getValue() > o2.getValue()? 1:-1; } }).getKey(); 

Java 8的方式来获得最大值的所有密钥。

 Integer max = PROVIDED_MAP.entrySet() .stream() .max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1) .get() .getValue(); List listOfMax = PROVIDED_MAP.entrySet() .stream() .filter(entry -> entry.getValue() == max) .map(Map.Entry::getKey) .collect(Collectors.toList()); System.out.println(listOfMax); 

你也可以使用parallelStream()而不是stream()来并行化它,

我有两种方法,使用这种方法来获得最大值的关键:

  public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map){ Entry<String, Integer> maxEntry = null; Integer max = Collections.max(map.values()); for(Entry<String, Integer> entry : map.entrySet()) { Integer value = entry.getValue(); if(null != value && max == value) { maxEntry = entry; } } return maxEntry; } 

作为一个例子,使用以下方法获取具有最大值的Entry:

  Map.Entry<String, Integer> maxEntry = getMaxEntry(map); 

使用Java 8,我们可以得到一个包含最大值的对象:

 Object maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey(); System.out.println("maxEntry = " + maxEntry); 

返回一个可选的答案,因为如果map是空的,map可能没有最大值: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

对于我的项目,我使用了Jon和Fathah的解决scheme的稍微修改版本。 在具有相同值的多个条目的情况下,它返回它find的最后一个条目:

 public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map) { Entry<String, Integer> maxEntry = null; Integer max = Collections.max(map.values()); for(Entry<String, Integer> entry : map.entrySet()) { Integer value = entry.getValue(); if(null != value && max == value) { maxEntry = entry; } } return maxEntry; } 

这个解决scheme好吗?

 int[] a = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 }; Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i : a) { Integer count = map.get(i); map.put(i, count != null ? count + 1 : 0); } Integer max = Collections.max(map.keySet()); System.out.println(max); System.out.println(map); 

你可以这样做

 HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(); hm.put(1,10); hm.put(2,45); hm.put(3,100); Iterator<Integer> it = hm.keySet().iterator(); Integer fk = it.next(); Integer max = hm.get(fk); while(it.hasNext()) { Integer k = it.next(); Integer val = hm.get(k); if (val > max){ max = val; fk=k; } } System.out.println("Max Value "+max+" is associated with "+fk+" key");