Chiave di ricerca associata al valore massimo in una mappa Java

Qual è il modo più semplice per ottenere la chiave associata al valore massimo in una mappa?

Credo che Collections.max (someMap) restituirà la chiave massima, quando si desidera che la chiave corrisponda al valore massimo.

Fondamentalmente avresti bisogno di scorrere il set di voci della mappa, ricordando sia il “massimo noto al momento” sia la chiave ad esso associata. (O solo la voce che contiene entrambi, ovviamente.)

Per esempio:

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

Per completezza, ecco un modo Java 8 per farlo

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

o

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

o

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

Questo codice stamperà tutte le chiavi con il valore massimo

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

Un semplice rivestimento usando Java-8

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

Ecco come farlo direttamente (senza un ciclo aggiuntivo esplicito) definendo il Comparator appropriato:

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

Una risposta che restituisce un Facoltativo poiché la mappa potrebbe non avere un valore massimo se è vuota: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

Java 8 modo per ottenere tutte le chiavi con valore massimo.

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

Inoltre puoi parallelizzare usando parallelStream() invece di stream()

Ho due metodi, usando questo metodo per ottenere la chiave con il valore massimo:

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

Ad esempio, inserendo la voce con il valore massimo utilizzando il metodo:

  Map.Entry maxEntry = getMaxEntry(map); 

Usando Java 8 possiamo ottenere un object contenente il valore massimo:

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

Questa soluzione è ok?

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

Per il mio progetto, ho usato una versione leggermente modificata della soluzione di Jon e Fathah. Nel caso di più voci con lo stesso valore, restituisce l’ultima voce trovata:

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

puoi fare così

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