Rumah >Java >javaTutorial >Bagaimanakah saya boleh mengisih Java HashMap mengikut nilainya dalam susunan menaik dan menurun?

Bagaimanakah saya boleh mengisih Java HashMap mengikut nilainya dalam susunan menaik dan menurun?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-03 05:24:09966semak imbas

How can I sort a Java HashMap by its values in ascending and descending order?

Mengisih HashMap mengikut Nilai

Di Java, HashMap ialah koleksi pasangan nilai kunci yang tidak diisih. Untuk mengisih HashMap mengikut nilainya, kita boleh menggunakan algoritma pengisihan luaran, kerana HashMap itu sendiri tidak menyediakan kaedah pengisihan terbina dalam.

Satu pendekatan biasa ialah menukar HashMap menjadi senarai terpautnya entri, susun senarai terpaut mengikut nilai, dan kemudian bina semula HashMap. Untuk memastikan pasangan nilai kunci kekal dipaut semasa proses ini, kami menggunakan pembanding yang membandingkan nilai sambil mengekalkan susunan nilai kunci asal.

Coretan kod berikut menunjukkan pendekatan ini:

import java.util.*;

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

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

        System.out.println("Before sorting...");
        printMap(unsortedMap);

        System.out.println("After sorting ascending order...");
        Map<String, Integer> sortedMapAsc = sortByValue(unsortedMap, ASC);
        printMap(sortedMapAsc);

        System.out.println("After sorting descending order...");
        Map<String, Integer> sortedMapDesc = sortByValue(unsortedMap, DESC);
        printMap(sortedMapDesc);
    }

    private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValue(Map<K, V> unsorted, final boolean order) {
        List<Map.Entry<K, V>> 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(
                        Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b, LinkedHashMap::new
                )
        );
    }

    private static void printMap(Map<String, Integer> map) {
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}

Kod ini menunjukkan pengisihan tertib menaik dan menurun dengan melaksanakan pembanding yang menilai nilai sambil mengekalkan yang asal perhubungan nilai utama.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengisih Java HashMap mengikut nilainya dalam susunan menaik dan menurun?. 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