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.
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;
}
}
pour l'exhaustivité, voici un java-8 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();
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
}
}
}
}
une simple doublure utilisant Java-8
Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
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();
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);
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()
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);
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);
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;
}
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");