您的位置:

如何用Java根据HashMap的值进行排序

一、使用Collections的sort方法

Java的Collections类中提供了一个sort方法可以对List进行排序。所以可以将HashMap中的键值对存放到List中,然后根据值进行排序,最后将排好序的键值对再放回HashMap中。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

public class SortHashMapByValue {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("apple", 8);
        map.put("banana", 5);
        map.put("pear", 3);
        map.put("watermelon", 2);

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

        Collections.sort(list, new Comparator<Entry<String, Integer>>() {
            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

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

        System.out.println(sortedMap);
    }
}

二、使用Stream API

Java 8中提供了Stream API,可以通过对HashMap进行操作来对键值对进行处理。可以使用Stream中的sorted方法来对值进行排序,最后将排好序的键值对放回HashMap中。

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SortHashMapByValue {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("apple", 8);
        map.put("banana", 5);
        map.put("pear", 3);
        map.put("watermelon", 2);

        HashMap<String, Integer> sortedMap = map.entrySet().stream()
                                    .sorted(Entry.comparingByValue())
                                    .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                                                              (e1, e2) -> e1, LinkedHashMap::new));

        System.out.println(sortedMap);
    }
}

三、使用PriorityQueue

Java中提供了PriorityQueue来生成一个优先级队列,使用优先级队列可以对HashMap的值进行排序。先将HashMap中的键值对放入优先级队列,然后遍历队列,取出排好序的键值对,最后将排好序的键值对再放回HashMap中。

import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.PriorityQueue;

public class SortHashMapByValue {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("apple", 8);
        map.put("banana", 5);
        map.put("pear", 3);
        map.put("watermelon", 2);

        PriorityQueue<Entry<String, Integer>> pq = new PriorityQueue<Entry<String, Integer>>(
                new Comparator<Entry<String, Integer>>() {
                    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                        return o2.getValue().compareTo(o1.getValue());
                    }
                });

        for (Entry<String, Integer> entry : map.entrySet()) {
            pq.offer(entry);
        }

        HashMap<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
        while (!pq.isEmpty()) {
            Entry<String, Integer> entry = pq.poll();
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        System.out.println(sortedMap);
    }
}