Rumah >Java >javaTutorial >Bagaimanakah saya boleh mengisih HashMap mengikut nilainya sambil mengekalkan pasangan nilai kunci dalam Java?

Bagaimanakah saya boleh mengisih HashMap mengikut nilainya sambil mengekalkan pasangan nilai kunci dalam Java?

Susan Sarandon
Susan Sarandonasal
2024-11-28 13:50:11743semak imbas

How can I sort a HashMap by its values while preserving key-value pairs in Java?

Isih Peta Hash mengikut Nilai

Masalah:

Kita perlu mengisih Peta Hash berdasarkan nilai yang terkandung di dalamnya, dan mengekalkan gandingan nilai kunci semasa pengisihan.

Penyelesaian:

Isih Peta Hash mengikut nilai boleh dicapai menggunakan pendekatan generik. Langkah-langkah berikut menggariskan proses:

  1. Buat Senarai Terpaut: Tukar entri HashMap ke LinkedList, memastikan tertib sisipan dikekalkan.
  2. Pembanding Tersuai: Tentukan pembanding tersuai untuk membandingkan nilai-nilai entri. Ia harus mempertimbangkan kedua-dua pilihan tertib menaik dan menurun.
  3. Isih Senarai: Gunakan pembanding tersuai untuk mengisih LinkedList berdasarkan nilai. Memandangkan entri dipautkan, kekunci juga akan diisih.
  4. Tukar kepada Sorted HashMap: Gunakan LinkedList yang diisih untuk membina LinkedHashMap baharu, di mana kunci dan nilai dikaitkan seperti dahulu dalam HashMap asal.
  5. Versi Tersuai: Versi tersuai bagi kaedah pengisihan boleh dibuat, membenarkan susunan nilai menaik atau menurun tertentu.

Contoh Pelaksanaan:

Kod Java berikut melaksanakan algoritma pengisihan:

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SortMapByValue {

    public static final boolean ASC = true;
    public static final boolean DESC = false;

    public static void main(String[] args) {

        // Create dummy HashMap
        Map<Integer, String> unsortedMap = new HashMap<>();
        unsortedMap.put(1, "froyo");
        unsortedMap.put(2, "abby");
        unsortedMap.put(3, "denver");
        unsortedMap.put(4, "frost");
        unsortedMap.put(5, "daisy");

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

        // Sort in descending order
        Map<Integer, String> sortedMapDesc = sortByValue(unsortedMap, DESC);

        // Print sorted maps
        System.out.println("Sorted Ascending:");
        printMap(sortedMapAsc);
        System.out.println("Sorted Descending:");
        printMap(sortedMapDesc);
    }

    private static Map<Integer, String> sortByValue(Map<Integer, String> map, boolean order) {

        List<Entry<Integer, String>> list = new LinkedList<>(map.entrySet());

        // Custom comparator for values
        Collections.sort(list, new Comparator<Entry<Integer, String>>() {
            public int compare(Entry<Integer, String> o1, Entry<Integer, String> o2) {
                if (order) {
                    return o1.getValue().compareTo(o2.getValue());
                } else {
                    return o2.getValue().compareTo(o1.getValue());
                }
            }
        });

        // Return sorted LinkedHashMap
        Map<Integer, String> sortedMap = new LinkedHashMap<>();
        for (Entry<Integer, String> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        return sortedMap;
    }

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

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengisih HashMap mengikut nilainya sambil mengekalkan pasangan nilai kunci dalam Java?. 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