Java中的TreeMap用于存储与HashMap
类非常相似的键值对。区别在于TreeMap提供了一种以排序顺序存储键/值对的有效方法。它是基于红黑树的NavigableMap
实现。
1.TreeMap构造函数
TreeMap有五种类型的构造函数:
- TreeMap():使用其键的自然顺序创建一个新的空树图。
- TreeMap(比较器c):创建一个新的空树图,根据给定的比较器排序。
- TreeMap(地图):创建一个新的树图,其中包含与给定地图相同的映射,根据其键的自然顺序排序。
- TreeMap(SortedMap map):创建一个新的树图,其中包含相同的映射并使用与指定的有序映射相同的顺序。
2. TreeMap方法
我们应该学习的关于TreeMap的重要方法如下:
- void clear():它从地图中删除所有键值对。
- void size():返回此映射中存在的键值对的数量。
- void isEmpty():如果此映射不包含键 - 值映射,则返回true。
- boolean containsKey(Object key):
'true'
如果地图中存在指定的键,则返回。 - 布尔的containsValue(对象键):它返回
'true'
如果一个指定的值被映射到地图上的至少一个键。 - Object get(Object key):它检索
value
指定的映射key
,如果此映射不包含键的映射,则返回null。 - Object remove(Object key):它从地图中删除指定键的键值对(如果存在)。
- 比较器比较器():它返回用于对此映射中的键进行排序的比较器,如果此映射使用其键的自然顺序,则返回null。
- Object firstKey():它返回树映射中当前的第一个(最少)键。
- Object lastKey():它返回树映射中当前的最后一个(最大)键。
- Object ceilingKey(Object key):返回大于或等于给定键的最小键,如果没有这样的键则返回null。
- Object higherKey(Object key):返回严格大于指定键的最小键。
- 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来判断唯一性。