按照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<String> {

    private Map<String, Integer> map;

    public ValueComparator(Map<String, Integer> map) {
        this.map = map;
    }

    public int compare(String k1, String k2) {
        // value相同的情况下,如果是return 0,则不同的key最后只能保留一个
        // 如果想按照key倒序排序,return k2.compareTo(k1)即可
        // 注意compareTo使用方法,如果是自定义的类,还需要实现Comparable<T>接口
        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<String, Integer> getSortedHashMap(Map<String, Integer> map) {
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> tmap = new TreeMap<String, Integer>(vc);
        tmap.putAll(map);
        return tmap;

    }

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

        TreeMap<String, Integer> tmap = getSortedHashMap(map);

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,297评论 0 16
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,542评论 0 3
  • List list(表)继承Collection(集合)接口,主要有Arraylist,LinkedList和Ve...
    fredal阅读 1,844评论 2 17
  • 转自作者:leesf 出处:http://www.cnblogs.com/leesf456/一、前言当我们需...
    抓兔子的猫阅读 514评论 0 1
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,416评论 11 349