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
Lepaskan: 2024-11-26 17:25:10
asal
536 orang telah melayarinya

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
            )
    );
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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

    ...
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan