TreeMap的排序

简介: TreeMap的排序

概述

Map是键值对的集合接口,它的实现类主要包括:HashMap、Hashtable以及LinkedHashMap等。

  1. TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
  2. HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。

Map.Entry返回Collections视图。

按key排序

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序。

TreeMap默认按key升序排序

public class T0 {
   
    public static void main(String[] args) {
   
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "a");
        treeMap.put(3, "b");
        treeMap.put(2, "c");

        for (Map.Entry<Integer, String> item :
                treeMap.entrySet()) {
   
            System.out.println(item);
        }
        Map.Entry<Integer, String> entry = treeMap.firstEntry();
        System.out.println("entry = " + entry);
    }
}

修改TreeMap的排序方式,按key降序排序

实现方式是自定义Comparator,可以直接使用Comparator.reverseOrder()或者手动实现Comparator.

new TreeMap<>(Comparator.reverseOrder())

public class T1 {
   
    public static void main(String[] args) {
   
        Comparator<Integer> keyComparator = new Comparator<Integer>() {
   
            @Override
            public int compare(Integer o1, Integer o2) {
   
                return o2.compareTo(o1);
            }
        };

        TreeMap<Integer, String> treeMap = new TreeMap(keyComparator);
        treeMap.put(1, "a");
        treeMap.put(3, "b");
        treeMap.put(2, "c");

        for (Map.Entry<Integer, String> item :
                treeMap.entrySet()) {
   
            System.out.println(item);
        }
        Map.Entry<Integer, String> entry = treeMap.firstEntry();
        System.out.println("entry = " + entry);
    }
}

按Value排序

以下只演示按TreeMap按Value升序排序,这同样适用于HashMap。

修改TreeMap的排序方式,按Value升序排序

注意:正常情况下Map是不可以使用Collections.sort()方法进行排序的,不过可以将Map转换成list之后再进行排序。

public class T2 {
   
    public static void main(String[] args) {
   

        Comparator<Map.Entry<Integer, String>> comparator = new Comparator<Map.Entry<Integer, String>>() {
   
            @Override
            public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
   
                return o1.getValue().compareTo(o2.getValue());
            }
        };

        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "a");
        treeMap.put(9, "e");
        treeMap.put(3, "b");
        treeMap.put(2, "c");
        ArrayList<Map.Entry<Integer, String>> list = new ArrayList<Map.Entry<Integer, String>>(treeMap.entrySet());
        Collections.sort(list, comparator);

        for (Map.Entry<Integer, String> entry : list) {
   
            System.out.println(entry);
        }
    }
}
目录
相关文章
|
搜索推荐 Java API
一道Java集合排序题,HashMap排序,面试必备
一道Java集合排序题,HashMap排序,面试必备
|
17天前
|
存储 Java
Java集合框架中的HashSet和TreeSet,解释了它们如何分别实现无序和有序存储。
【10月更文挑战第13天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解释了它们如何分别实现无序和有序存储。通过解析内部机制和示例代码,帮助读者理解这两种集合的特点和应用场景,从而更好地选择合适的集合类型满足实际需求。
26 3
|
16天前
|
存储 Java 开发者
HashSet和TreeSet教你重新认识Java集合的无序与有序
【10月更文挑战第14天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了它们分别实现无序和有序存储的机制。通过理解HashSet基于哈希表的无序特性和TreeSet利用红黑树实现的有序性,帮助开发者更好地选择合适的集合类型以满足不同的应用场景。
12 2
|
5月前
|
存储 Java
打破常规!HashSet和TreeSet教你重新认识Java集合的无序与有序
【6月更文挑战第17天】Java集合框架中的Set接口,HashSet无序而TreeSet有序。HashSet基于哈希表,元素插入顺序不可预测,适合快速去重。TreeSet利用红黑树保证有序性,支持自然排序或自定义排序。若需同时无序和有序,可先用HashSet去重,再将元素加入TreeSet,但会牺牲性能。选择时依据对顺序和性能的需求。
149 2
TreeSet的两种排序方式
示例: 示例公用类: public class MyDate { private int month; private int year; private int day; @Override public String toString() { return "MyDate{" + "month=" + month + ", year=" + year +
105 0
TreeSet的两种排序方式
|
存储 算法 Java
TreeSet类的排序问题
TreeSet支持两种排序方法:自然排序和定制排序。TreeSet默认采用自然排序。1、自然排序    TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。
1685 0
有趣又有序的LinkedHashMap(一)
哈喽,大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
有趣又有序的LinkedHashMap(一)
|
消息中间件 前端开发 JavaScript
有趣又有序的LinkedHashMap(二)
哈喽,大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
有趣又有序的LinkedHashMap(二)