美文网首页Java
如何使用Map进行排序

如何使用Map进行排序

作者: 小吴不睡觉 | 来源:发表于2020-09-28 14:50 被阅读0次

    关于Map的排序,首先我们先了解一下 TreeMap
    TreeMap :
    1.基于红黑树实现的排序Map
    2.实现了SortedMap接口,默认根据Map的key升序排序
    3.key不能为空
    4.线程不安全

    • 根据Map的key进行排序,我们可以使用TreeMap
     TreeMap<String, Integer> treeMap = new TreeMap<>();
            treeMap.put("a", 2);
            treeMap.put("c", 1);
            treeMap.put("b", 3);
            treeMap.put("e", 5);
            treeMap.put("d", 6);
            treeMap.put("f", 4);
            Set<Map.Entry<String, Integer>> entries = treeMap.entrySet();
            for (Map.Entry<String, Integer> entry : entries) {
                System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
            }
    

    我们可以得到如下结果:

    key=a,value=2
    key=b,value=3
    key=c,value=1
    key=d,value=6
    key=e,value=5
    key=f,value=4
    

    不难发现,key已经自动根据a-z的顺序进行了排序;
    当然,如果我们将key置为数字,依然会按照从小到大的顺序进行排序;

    TreeMap<Integer, String> treeMap = new TreeMap<>();
            treeMap.put(2, "aa");
            treeMap.put(1, "ab");
            treeMap.put(3, "ad");
            treeMap.put(5, "ae");
            treeMap.put(6, "ac");
            treeMap.put(4, "af");
            Set<Map.Entry<Integer, String>> entries = treeMap.entrySet();
            for (Map.Entry<Integer, String> entry : entries) {
                System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
            }
    

    我们可以得到如下结果:

    key=1,value=ab
    key=2,value=aa
    key=3,value=ad
    key=4,value=af
    key=5,value=ae
    key=6,value=ac
    
    • 当我们想要根据Map的value进行排序呢?
      我们可以使用SortedMap,结合Comparator比较器,再使用Lambda表达式轻松实现根据value的排序
     SortedMap<String, Integer> sortedMap = new TreeMap<>();
            sortedMap.put("a", 2);
            sortedMap.put("c", 1);
            sortedMap.put("b", 3);
            sortedMap.put("e", 5);
            sortedMap.put("d", 6);
            sortedMap.put("f", 4);
            Set<Map.Entry<String, Integer>> entrySet = sortedMap.entrySet();
           
            List<Map.Entry<String, Integer>> list = new ArrayList<>();
            list.addAll(entrySet);
            Collections.sort(list, Comparator.comparing(o -> o.getValue().toString()));
            for (Map.Entry<String, Integer> entry : list) {
                System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
            }
    

    我们可以得到如下结果:

    key=c,value=1
    key=a,value=2
    key=b,value=3
    key=f,value=4
    key=e,value=5
    key=d,value=6
    

    亦可如下编写代码:

        SortedMap<String, Integer> sortedMap = new TreeMap<>();
            sortedMap.put("a", 2);
            sortedMap.put("c", 1);
            sortedMap.put("b", 3);
            sortedMap.put("e", 5);
            sortedMap.put("d", 6);
            sortedMap.put("f", 4);
            Set<Map.Entry<String, Integer>> entrySet = sortedMap.entrySet();
            List<Map.Entry<String, Integer>> list = new ArrayList<>();
            list.addAll(entrySet);
            List<Map.Entry<String, Integer>> collect = list.stream().sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)).collect(Collectors.toList());
            for (Map.Entry<String, Integer> entry : collect) {
                System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
            }
    

    得到结果如下:

    key=c,value=1
    key=a,value=2
    key=b,value=3
    key=f,value=4
    key=e,value=5
    key=d,value=6
    

    在JDK 1.8中新增了函数式编程,对上述代码的解释为:
    1.先将list集合转换为流,即:list.stream(),值得注意的是:在stream()中所做的任何操作都不会影响到原集合;
    2.sorted() 方法:对list集合进行排序;
    3.Comparator.comparing(Map.Entry<String, Integer>::getValue):顾名思义,就是此处的比较规则,Map.Entry中有getKey(),getValue()等方法,通过改变取值,就可以改变排序对象,而默认排序为自然排序,reversed():该方法将其改变为倒序;
    4.map(Map.Entry<String, Integer>::getKey):此处将Entry<String, Integer>中的key单独抽离出来;
    5.collect(Collectors.toList()):告诉程序返回的是一个List集合;

    相关文章

      网友评论

        本文标题:如何使用Map进行排序

        本文链接:https://www.haomeiwen.com/subject/qnpduktx.html