TreeMap是基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序 进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
containsKey 、get 、put 和 remove 操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。
TreeMap不是线程安全的,如果有多个线程操作同一个的情况的话,应该改用Collections.synchronizedSortedMap 方法来“包装”该映射。例子:SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
我们在开发项目的时候,排序处理是经常有的。如果每次遇到要排序的时候都自己去实装的话,代码量会猛增。这样就造成类似的代码很多。怎么才能避免类似代码呢。采用共同的排序方法是很有必要的。
TreeMap的构造方法有以下几种:
使用键的自然顺序构造一个新的、空的树映射。 |
构造一个新的、空的树映射,该映射根据给定比较器进行排序。 |
构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。 |
构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。 |
如果只是按照自然顺序排序的话,我们直接用TreeMap()构造函数就可以了。但往往实际的项目中我们需要根据实际的要求的来排序。这样的话TreeMap()构造函数就不满足要求了。我们可以用TreeMap (Comparator <? super K
来实现。这个构造函数的优势就是提供了设置比较器的接口。我们只要实装一个比较通用的比较算法就可以了。
我们在自己的比较器中实现compare方法,比如我们的逻辑是根据OrderNum来排序。(注意是从CSV文件读入的数据的情况,如果是从数据库查询的话Order By就可以了,不需要这么麻烦)。
由于每个功能的对象类型并不一样。因此要写一个共同的方法的话,得在自己的比较器构造函数里面把要必要的对象的属性名(比如orderNum)和对象类传进去。
public MyCompare(String compName, String compClass) {
// 设置比较对象的属性名
this.compName = compName;
// 设置比较对象的class
this.compClass = compClass;
}
然后实装compare方法
int compare(Object o1, Object o2) {
//取得对象o1的compName的值
....
//取得对象o2的compName的值
....
//比较大小
....
}
这样我们就在具体的逻辑处理,只要用自己的比较器生成TreeMap后就能够得到排好顺序的数据了。这样就能减少不少重复代码。我在有几个项目中就发现好多人都是一个功能一个比较器。代码不够精简。