Heim  >  Artikel  >  Java  >  Wie kann ich eine HashMap nach Werten sortieren und dabei die Schlüsselreihenfolge beibehalten?

Wie kann ich eine HashMap nach Werten sortieren und dabei die Schlüsselreihenfolge beibehalten?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 17:25:10464Durchsuche

How Can I Sort a HashMap by Values, Maintaining Key Order?

HashMap nach Werten sortieren

Problem:
Wie kann eine HashMap nach den gespeicherten Werten sortiert werden? darin, um sicherzustellen, dass die Schlüssel automatisch sortiert werden Na ja?

Lösung:

Generische Methode (Pre-Java 8):

Implementieren Sie eine generische Methode zum Sortieren von a Karte:

private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sort(
        final Map<K, V> unsorted,
        final boolean order) {
    final var list = new LinkedList<>(unsorted.entrySet());

    list.sort((o1, o2) -> order
                          ? o1.getValue().compareTo(o2.getValue()) == 0
                            ? o1.getKey().compareTo(o2.getKey())
                            : o1.getValue().compareTo(o2.getValue())
                          : o2.getValue().compareTo(o1.getValue()) == 0
                            ? o2.getKey().compareTo(o1.getKey())
                            : o2.getValue().compareTo(o1.getValue()));
    return list.stream().collect(
            Collectors.toMap(
                    Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new
            )
    );
}

Verwendung mit Aufsteigend und Absteigend Reihenfolge:

import java.util.HashMap;
import java.util.Map;

public class SortMapByValue {
    public static final boolean ASC = true;
    public static final boolean DESC = false;

    public static void main(String[] args) {
        // Create an unsorted map
        Map<String, Integer> unsortMap = new HashMap<>();
        unsortMap.put("B", 55);
        unsortMap.put("A", 80);
        unsortMap.put("D", 20);
        unsortMap.put("C", 70);

        // Sort in ascending order
        Map<String, Integer> sortedMapAsc = sort(unsortMap, ASC);

        // Sort in descending order
        Map<String, Integer> sortedMapDesc = sort(unsortMap, DESC);
    }
}

Neuere Funktionen von Java 8 und höher:

Alternativ eine prägnantere Lösung mit Java 8-Lambda-Ausdrücken:

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SortMapByValue {
    ...

    private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap, final boolean order) {
        List<Entry<String, Integer>> list = new LinkedList<>(unsortMap.entrySet());
        list.sort((o1, o2) -> order ? o1.getValue().compareTo(o2.getValue()) == 0
                ? o1.getKey().compareTo(o2.getKey())
                : o1.getValue().compareTo(o2.getValue()) : o2.getValue().compareTo(o1.getValue()) == 0
                ? o2.getKey().compareTo(o1.getKey())
                : o2.getValue().compareTo(o1.getValue()));
        return list.stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new));
    }

    ...
}

Das obige ist der detaillierte Inhalt vonWie kann ich eine HashMap nach Werten sortieren und dabei die Schlüsselreihenfolge beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn