Java HashMap größten Double Value entnehmen?
Moin Moin,
Wie kann man aus einer HashMap (Key: String, Value: Double) den größten Value Wert entnehmen? Und dazu noch den zugehörigen Key.
Wäre über Antworten sehr dankbar.
~ otteo
2 Antworten
jshell> var test = Map.of("bla", 1.0, "blubb", 2.0);
test ==> {bla=1.0, blubb=2.0}
jshell> Collections.max(test.entrySet(), Map.Entry.comparingByValue())
$5 ==> blubb=2.0
Das gibt dir den Entry mit dem größten Wert - wenn du mit "entnehmen" meinst dass er entfernt werden soll, kannst du das dann per Key tun.
Du musst dir aber auch überlegen was du willst, wenn es mehr als einen größten Wert gibt.
Hier ein Beispiel:
HashMap<String, Double> map = new HashMap<String, Double>();
map.put("1", 1.0);
map.put("2", 2.0);
map.put("3", 3.0);
Double maxDouble = map.values().stream().max(Comparator.comparingDouble(Double::doubleValue)).get();
System.out.println("Maximaler Double in Hashmap: " + maxDouble);
Stream<String> stream = map.entrySet().stream().filter(entry -> entry.getValue() == maxDouble)
.map(Map.Entry::getKey);
String keyForMaxDouble = stream.findFirst().get();
System.out.println("Erster gefundener Key zu maximalem Double: " + keyForMaxDouble);
statt "stream.findFirst()" machst du dann am besten ArrayList<String> maxKeylist = (ArrayList<String>) stream.collect(Collectors.toList()); "
damit holst du dir dann alle Keys, die den maximalwert besitzen.
Wenn es jeden Wert nur einmal geben kann, ist das trivial - EntrySet nach Value sortieren lassen, zweiten Wert nehmen, fertig.
Wenn es Werte mehrfach gibt (und als nächste Frage dann der 3. oder der 4. Wert kommt...), wird es etwas mühsamer. Da könnte man sich mit groupingBy() die Liste als geordnete Map umbauen lassen.
var mp = bla.stream().collect(
Collectors.groupingBy(Map.Entry::getValue,
TreeMap::new,
Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
Die kannst du dann durchtraversieren und dir den n-t größten Wert und die damit verbundenen Keys holen. Wir machen uns hier zunutze, dass die TreeMap nach Keys sortiert.
Vielen Dank, und wie kann ich das selbe, bloß mit dem 2. größten Wert machen?
~ otteo