根据Value对Map中的对象进行排序

背景

SortedMap的实现类TreeMap可以按自然顺序或自定义顺序遍历键(key),有时我们需要根据值(Value)进行排序,本文提供了一种简单实现思路。

实现

  • Comparator接口
    使用Value排序时,仍然使用TreeMap实现类,只不过需要在TreeMap的构造函数中引入Comparator实现。

  • TreeMap构造器
    ValueComparator是Comparator接口的实现,该实现包含了一个普通的Map对象作为成员变量,并在compare方法中做了一点手脚。即在compare方法中,将key的比较转换为value的比较。

  • 局限性

  这种方式只能对Map进行排序,而不能添加单个key-value映射。

  • 具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
 
/**
 * Created by liutingna on 2017/9/30.
 */
public class TestComparator {
    class ValueComparator implements Comparator<String> {
 
        Map<String, Long> base;
 
        //Comparator外部比较器
        public ValueComparator(Map<String, Long> base) {
            this.base = base;
        }
 
        //根据Map的值进行比较
        public int compare(String a, String b) {
            return base.get(a).compareTo(base.get(b));
        }
    }
 
    public static void main(String[] args) {
        Map<String, Long> map = new HashMap<>();
        TestComparator testComparator = new TestComparator();
        TestComparator.ValueComparator valueComparator = testComparator.new ValueComparator(map);
        Map<String, Long> keySortMap = new TreeMap<>();
        Map<String, Long> valueSortMap = new TreeMap<>(valueComparator);
 
        map.put("aaa", 15L);
        map.put("bxw", 13L);
        map.put("abc", 14L);
        map.put("bbb", 18L);
        System.out.println(map);//{aaa=15, bxw=13, abc=14, bbb=18}
 
        //根据key进行比较
        keySortMap.putAll(map);
        System.out.println(keySortMap);//{aaa=15, abc=14, bbb=18, bxw=13}
        //根据value进行比较
        valueSortMap.putAll(map);
//        valueSortMap.put("ccc",17L);//NullPointerException,这种方式只能对Map进行排序,而不能添加单个key-value映射
        System.out.println(valueSortMap);//{bbb=18, aaa=15, abc=14, bxw=13}
    }
}

  

相关资料

Comparable和Comparator的区别

posted @   ITRoad  阅读(5140)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示