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