Java HashMap größten Double Value entnehmen?

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);
Woher ich das weiß:eigene Erfahrung – Ich habe selber lange im PC gearbeitet

otteo 
Beitragsersteller
 14.05.2021, 15:09

Vielen Dank, und wie kann ich das selbe, bloß mit dem 2. größten Wert machen?

~ otteo

0
ZaoDaDong  14.05.2021, 15:12
@otteo

Das einfachste wäre es nun alle Entrys mit dem maxValue aus der Map zu entfernen und den Prozess zu wiederholen (eventuell mit einer 2. temporären Hashmap)

0
ZaoDaDong  14.05.2021, 15:23
@ZaoDaDong

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.

0
alfredo153  14.05.2021, 21:13
@otteo

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.

0