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


    背景

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

    实现

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

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

    • 局限性

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

    • 具体实现代码

    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的区别

  • 相关阅读:
    论如何O(1)快速乘
    luogu3605晋升者计数
    分数规划小结
    洛谷 P1589 泥泞路 & 2019青岛市竞赛(贪心)
    洛谷 P3368 【模板】树状数组 2(区间加,单点查询)
    前缀和序列 & 差分序列
    洛谷 P3374 【模板】树状数组 1(单点加,区间和)
    2019青岛市程序设计竞赛游记
    0x3f3f3f3f 0xbfbfbfbf 等的原理及应用
    memset 初始化数组 & 实现原理
  • 原文地址:https://www.cnblogs.com/myitroad/p/7615082.html
Copyright © 2020-2023  润新知