Den Schlüssel finden, der mit dem maximalen Wert in einer Java Map verknüpft ist

Was ist der einfachste Weg, den Schlüssel mit dem Maximalwert in einer Map zu verknüpfen?

Ich glaube, dass Collections.max (someMap) den maximalen Schlüssel zurückgibt, wenn Sie den Schlüssel wünschen, der dem maximalen Wert entspricht.

Im Grunde müssten Sie über den Eintragssatz der Karte iterieren, wobei Sie sich sowohl an das “derzeit bekannte Maximum” als auch an den damit verknüpften Schlüssel erinnern. (Oder nur der Eintrag, der beides enthält.)

Beispielsweise:

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

Der Vollständigkeit halber ist hier ein Java 8 Weg, es zu tun

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

oder

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

oder

 Collections.max(countMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getKey(); 

Dieser Code wird alle Schlüssel mit maximalem Wert drucken

 public class NewClass4 { public static void main(String[] args) { HashMapmap=new HashMap(); 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 entry : map.entrySet()) { // Itrate through hashmap if (entry.getValue()==maxValueInMap) { System.out.println(entry.getKey()); // Print the key with max value } } } } 

Ein einfacher Liner mit Java-8

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

Gehen Sie folgendermaßen vor (ohne eine explizite zusätzliche Schleife), indem Sie den entsprechenden Comparator :

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

Eine Antwort, die ein Optional zurückgibt, da die Map möglicherweise keinen Maximalwert hat, wenn sie leer ist: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

Java 8 Möglichkeit, alle Schlüssel mit maximalem Wert zu erhalten.

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

Sie können es auch parallelisieren, indem Sie parallelStream() anstelle von stream()

Ich habe zwei Methoden, um mit dieser Methode den Schlüssel mit dem maximalen Wert zu erhalten:

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

Als Beispiel erhalten Sie den Eintrag mit dem maximalen Wert mit der Methode:

  Map.Entry maxEntry = getMaxEntry(map); 

Mit Java 8 können wir ein Objekt mit dem Maximalwert erhalten:

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

Ist diese Lösung in Ordnung?

 int[] a = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 }; Map map = new HashMap(); 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); 

Für mein Projekt verwendete ich eine leicht modifizierte Version von Jons und Fathahs Lösung. Bei mehreren Einträgen mit demselben Wert wird der letzte gefundene Eintrag zurückgegeben:

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

das kannst du machen

 HashMap hm = new HashMap(); hm.put(1,10); hm.put(2,45); hm.put(3,100); Iterator 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");