使用TreeMap减少重复代码
2009-09-05 16:35
239 查看
TreeMap是基于红黑树(Red-Black tree)的
实现。该映射根据其键的自然顺序
进行排序,或者根据创建映射时提供的
进行排序,具体取决于使用的构造方法。
此实现为 containsKey
、get
、put
和 remove
操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms
中的算法的改编。
TreeMap不是线程安全的,如果有多个线程操作同一个的情况的话,应该改用
方法来“包装”该映射。例子:SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
我们在开发项目的时候,排序处理是经常有的。如果每次遇到要排序的时候都自己去实装的话,代码量会猛增。这样就造成类似的代码很多。怎么才能避免类似代码呢。采用共同的排序方法是很有必要的。
TreeMap的构造方法有以下几种:
如果只是按照自然顺序排序的话,我们直接用TreeMap()构造函数就可以了。但往往实际的项目中我们需要根据实际的要求的来排序。这样的话TreeMap()构造函数就不满足要求了。我们可以用
来实现。这个构造函数的优势就是提供了设置比较器的接口。我们只要实装一个比较通用的比较算法就可以了。
我们在自己的比较器中实现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后就能够得到排好顺序的数据了。这样就能减少不少重复代码。我在有几个项目中就发现好多人都是一个功能一个比较器。代码不够精简。
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 (Comparator <? super K > comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。 |
TreeMap (Map <? extends K ,? extends V > m) 构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。 |
TreeMap (SortedMap <K ,? extends V > m) 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。 |
TreeMap (Comparator <? super K > comparator)
来实现。这个构造函数的优势就是提供了设置比较器的接口。我们只要实装一个比较通用的比较算法就可以了。
我们在自己的比较器中实现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后就能够得到排好顺序的数据了。这样就能减少不少重复代码。我在有几个项目中就发现好多人都是一个功能一个比较器。代码不够精简。
相关文章推荐
- 相比xib 使用代码编排view 的一个明显的好处就是可以更好地重复使用已有代码,减少代码冗余。
- 使用Lombok减少JavaBean的重复代码
- 使用匿名函数减少重复代码
- 新手编程入门二:使用“模板模式”减少重复代码
- 一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
- 使用匿名函数减少重复代码
- 减少你的重复代码-lombok使用教程-idea集成插件
- 减少你的重复代码-lombok使用教程-idea集成插件
- 使用perl清理电脑上重复文件实现代码(续)
- 使用 XPath 2.0 和 XSLT 2.0 节省开发时间并减少代码量
- 使用此Adapter,代码量可大大减少
- 在iOS开发中使用反射减少一些代码工作
- 使用Spring减少代码量
- 编写高质量代码改善C#程序的157个建议——建议98:用params减少重复参数
- 可重复使用Tab切换代码和纯js代码
- 0+个方便,可重复使用的jQuery代码片段
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- Obj-C语言开发iOS项目使用反射减少代码工作
- 巧用成员指针减少代码重复
- 如何用CodeSmith减少代码重复编写