Java中的TreeMap用于存储与HashMap类非常相似的键值对。区别在于TreeMap提供了一种以排序顺序存储键/值对的有效方法。它是基于红黑树NavigableMap实现。

1.TreeMap构造函数

TreeMap有五种类型的构造函数:

  1. TreeMap():使用其键的自然顺序创建一个新的空树图。
  2. TreeMap(比较器c):创建一个新的空树图,根据给定的比较器排序。
  3. TreeMap(地图):创建一个新的树图,其中包含与给定地图相同的映射,根据其键的自然顺序排序。
  4. TreeMap(SortedMap map):创建一个新的树图,其中包含相同的映射并使用与指定的有序映射相同的顺序。


2. TreeMap方法

我们应该学习的关于TreeMap的重要方法如下:

  1. void clear():它从地图中删除所有键值对。
  2. void size():返回此映射中存在的键值对的数量。
  3. void isEmpty():如果此映射不包含键 - 值映射,则返回true。
  4. boolean containsKey(Object key):'true'如果地图中存在指定的键,则返回。
  5. 布尔的containsValue(对象键):它返回'true'如果一个指定的值被映射到地图上的至少一个键。
  6. Object get(Object key):它检索value指定的映射key,如果此映射不包含键的映射,则返回null。
  7. Object remove(Object key):它从地图中删除指定键的键值对(如果存在)。
  8. 比较器比较器():它返回用于对此映射中的键进行排序的比较器,如果此映射使用其键的自然顺序,则返回null。
  9. Object firstKey():它返回树映射中当前的第一个(最少)键。
  10. Object lastKey():它返回树映射中当前的最后一个(最大)键。
  11. Object ceilingKey(Object key):返回大于或等于给定键的最小键,如果没有这样的键则返回null。
  12. Object higherKey(Object key):返回严格大于指定键的最小键。
  13. NavigableMap descendingMap():它返回此映射中包含的映射的逆序视图

3. TreeMap的排序

在TreeMap中,如果key值是java中的基本类型,TreeMap会自身帮我们排序,如果是自定义类型,如定义一个Student类作为key值,我们如果不告知排序规则的话,运行就会报错。所以,如何实现自定义排序呢?解决方案有2个,二者选一即可:

在Student类中实现Comparable,重写compareTo方法
在构造函数中new Comparator,匿名内部类,重写compare 方法

TreeMap<String,List<ZTreeDTO>> retultMap = new TreeMap<String,List<ZTreeDTO>>(new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				o1 = getTypeByProjectName(o1);
            	o2 = getTypeByProjectName(o2);
                return  o1.compareTo(o2);
			}
        });

注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;

注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一致的人为相同的人,  如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,以为可能姓名不同(年龄相同姓名不同的人  是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.)

通过return 0来判断唯一性。