按照Value对HashMap排序

TreeMap基于红黑树排序的算法,默认数据put进来按照key的大小升序排序,如果需要改成按value排序,则自定义新的Comparator,重写compare(Object, Object)方法即可。看TreeMap的源码可知,它实现了AbstractMap类的put(K, V)方法,put方法中调用compare(K, K),此方法会取构造器传进来的Comparator,如果构造器没有传Comparator,则直接比较key的值。

// ValueComparator.java

import java.util.Comparator;
import java.util.Map;

public class ValueComparator implements Comparator {

    private Map map;

    public ValueComparator(Map map) {
        this.map = map;
    }

    public int compare(String k1, String k2) {
        // value相同的情况下,如果是return 0,则不同的key最后只能保留一个
        // 如果想按照key倒序排序,return k2.compareTo(k1)即可
        // 注意compareTo使用方法,如果是自定义的类,还需要实现Comparable接口
        if(map.get(k1) >= map.get(k2)) {
            return 1;
        }else {
            return -1;
        }
    }
}

// SortingHashMap.java

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;


public class SortingHashMap {

    public static TreeMap getSortedHashMap(Map map) {
        ValueComparator vc = new ValueComparator(map);
        TreeMap tmap = new TreeMap(vc);
        tmap.putAll(map);
        return tmap;

    }

    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("a", 3);
        map.put("b", 2);
        map.put("c", 1);

        TreeMap tmap = getSortedHashMap(map);

        for(Map.Entry e: tmap.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
    }
}

你可能感兴趣的:(按照Value对HashMap排序)