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

Quelle est la façon la plus facile d'obtenir la clé associée à la valeur max dans une carte?

je crois que Collections.max (someMap) retournera la clé max, quand vous voulez la clé qui correspond à la valeur max.

95
demandé sur Ben B. 2011-05-06 16:07:30

11 réponses

fondamentalement, vous auriez besoin d'itérer sur le jeu d'entrée de la carte, en se 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<Foo, Bar> maxEntry = null;

for (Map.Entry<Foo, Bar> entry : map.entrySet())
{
    if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
    {
        maxEntry = entry;
    }
}
98
répondu Jon Skeet 2011-05-06 12:10:04

pour l'exhaustivité, voici un façon de le faire

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();
60
répondu Hilikus 2018-09-25 00:41:01

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

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

    }
}
41
répondu Fathah Rehman P 2012-06-29 05:08:32

une simple doublure utilisant Java-8

Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
30
répondu Sleiman Jneidi 2016-05-22 13:04:31

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

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();
6
répondu Amir 2014-05-23 17:09:16

une réponse qui renvoie une option puisque la carte peut ne pas avoir de valeur max si elle est vide: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);

4
répondu Dave L. 2016-11-09 22:24:26

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

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 également le mettre en parallèle en utilisant parallelStream() au lieu de stream()

3
répondu Mariusz Szurgot 2017-06-13 12:02:26

j'ai deux méthodes, en utilisant cette méthode pour obtenir la clé avec la valeur max:

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

comme exemple pour obtenir L'entrée avec la valeur max en utilisant la méthode:

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

en utilisant Java 8 nous pouvons obtenir un objet contenant la valeur max:

Object maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();      

System.out.println("maxEntry = " + maxEntry);
3
répondu Jorgesys 2017-06-22 20:20:42

Cette solution est-elle correcte?

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);
1
répondu Danilo 2015-11-18 17:24:17

pour mon projet, j'ai utilisé une version légèrement modifiée de la solution de Jon et Fathah. Dans le cas d'entrées multiples avec la même valeur, il renvoie la dernière entrée qu'il trouve:

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;
}
0
répondu silver 2015-09-20 02:44:32

vous pouvez le faire comme ça

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");
-1
répondu Parnab Sanyal 2016-04-25 08:42:47