Recherche de clé associée à la valeur max dans une carte Java

Quel est le moyen le plus simple d’obtenir une clé associée à la valeur maximale dans une carte?

Je crois que Collections.max (someMap) renverra la clé max, lorsque vous souhaitez que la clé corresponde à la valeur maximale.

Fondamentalement, vous devez parcourir le jeu d’entrées de la carte, en vous rappelant à la fois le “maximum actuellement connu” et la clé qui lui est associée. (Ou simplement l’entrée contenant les deux, bien sûr.)

Par exemple:

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

Pour être complet, voici une manière de faire Java 8

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

ou

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

ou

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

Ce code imprimera toutes les clés avec une valeur maximale

 public class NewClass4 { public static void main(Ssortingng[] 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 } } } } 

Un simple paquebot utilisant Java-8

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

Voici comment procéder directement (sans boucle supplémentaire explicite) en définissant le Comparator approprié:

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

Une réponse qui renvoie un Facultatif, car la carte peut ne pas avoir de valeur max si elle est vide: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

Java 8 façon d’obtenir toutes les clés avec une valeur maximale.

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

Vous pouvez aussi le paralléliser en utilisant parallelStream() au lieu de stream()

J’ai deux méthodes, en utilisant cette méthode pour obtenir la clé avec la valeur maximale:

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

À titre d’exemple, obtenez l’entrée avec la valeur maximale en utilisant la méthode:

  Map.Entry maxEntry = getMaxEntry(map); 

En utilisant Java 8, nous pouvons obtenir un object contenant la valeur maximale:

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

Est-ce que cette solution est correcte?

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

Pour mon projet, j’ai utilisé une version légèrement modifiée de la solution de Jon et Fathah. Dans le cas de plusieurs entrées ayant la même valeur, il renvoie la dernière entrée trouvée:

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

vous pouvez faire comme ça

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