Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Isih Peta Hash mengikut Nilai, Mengekalkan Susunan Utama?

Bagaimanakah Saya Boleh Isih Peta Hash mengikut Nilai, Mengekalkan Susunan Utama?

Patricia Arquette
Patricia Arquetteasal
2024-11-26 17:25:10529semak imbas

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

Mengisih HashMap mengikut Nilai

Masalah:
Bagaimanakah HashMap boleh diisih mengikut nilai yang disimpan di dalamnya, memastikan bahawa kekunci diisih secara automatik sebagai baik?

Penyelesaian:

Kaedah Generik (Pra-Java 8):

Melaksanakan kaedah generik untuk mengisih peta:

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

Penggunaan dengan Menaik dan Menurun Pesanan:

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

Ciri Java 8 dan Keatas yang lebih baharu:

Sebagai alternatif, penyelesaian yang lebih ringkas menggunakan ungkapan lambda Java 8:

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

    ...
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Isih Peta Hash mengikut Nilai, Mengekalkan Susunan Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn