36、TreeSet详解
TreeSet是SortedSet接口的实现类,TreeSet可以保证元素处于排序状态。与HashSet相比,TreeSet还提供了如下几个而外的方法:
1)、Comparator comparator():如果TreeSet采用了定制排序,则方法返回定制排序所使用的Comparator;如果TreeSet采用的是自然排序,则返回null
2)、Object first():返回集合的第一个元素
3)、Object last():返回集合的最后一个元素
4)、Object lower(Object e):返回集合中位于指定元素之前的元素
5)、Object higher(Object e):返回集合中位于指定元素之后的元素
6)、SortedSet subSet(Object fromElement,Object toElement):返回此Set的子集合,返回从fromElement(包含)到toElement(不包含)
7)、SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素组成
8)、SortedSet tailSet(Object fromElement):返回此Set的子集,由大于或等于fromElement的元素组成
由于TreeSet元素有排序状态,TreeSet会调用集合元素的compareTo方法来比较元素之间的大小,所以这些元素对于的类必须实现Comparable接口。同时在元素调用compareTo方法时,如果两个元素的类型不一致,会出现ClassCastException异常。
总结起来,TreeSet使用要求有:
1、TreeSet中存储的对象必须是同类型的对象
2、TreeSet中存储的类型必须实现了Comparable接口
public class Test { public static void main(String[] args) {
Student s1=new Student("robin", 20080101);
Student s2=new Student("ken", 20080114);
Student s3=new Student("lucy", 20080102);
Student s4=new Student("jock", 20080103);
TreeSet<Student> set=new TreeSet<Student>(); set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
System.out.println(set); }
} class Student implements Comparable<Student>{
private String name;
private int code;
public int getCode(){
return code;
}
public Student(String name,int code){
this.name=name;
this.code=code;
}
@Override
public int compareTo(Student o) {
return this.code-o.code;
}
@Override
public String toString() {
return "Student [name=" + name + ", code=" + code + "]";
} }
结果:[Student [name=robin, code=20080101], Student [name=lucy, code=20080102], Student [name=jock, code=20080103], Student [name=ken, code=20080114]]
如果改变TreeSet中对象的实例变量,这将导致它与其它对象的大小顺序发生变化,但TreeSet不会再次调整他们的顺序,然后会出现其它问题。所以在使用TreeSet和HashSet时,为了程序的更加健壮,推荐不要修改放入HashSet和TreeSet中的元素的关键实例变量。
定制排序
public static void main(String[] args) {
Student s1=new Student("robin", 20080101);
Student s2=new Student("ken", 20080114);
Student s3=new Student("lucy", 20080102);
Student s4=new Student("jock", 20080103);
TreeSet<Student> set=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o2.getCode()-o1.getCode();
}
}); set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
System.out.println(set); }
输出结果:[Student [name=ken, code=20080114], Student [name=jock, code=20080103], Student [name=lucy, code=20080102], Student [name=robin, code=20080101]]
最新文章
- remi
- HDU 1789 Doing Homework again(贪心)
- Android自定义之仿360Root大师水纹效果
- 转!!java线程状态
- iOS开发笔记系列-基础7(C语言特性)
- 实习之vim基本学习
- 2016 Multi-University Training Contest 4 总结
- U3d keyCode值对应的按键
- 混合app
- 原生js+canvas实现滑动拼图验证码
- 初探linux子系统集之timer子系统(三)
- mybatis逆向工程generatorConfiguration详细配置
- UI移动设备屏幕知识
- WMI 连接远程计算机并进行局域网进程扫描
- Hibernate 注解和配置文件两种方法的对比(有实例)
- CF 1064B Equations of Mathematical Magic(思维规律)
- ios软键盘将页面抵到上面后,关闭软键盘页面不回弹
- apache 各种配置
- 机器学习学习笔记之一:K最近邻算法(KNN)
- 转:devise使用
热门文章
- 74.Interesting Sequence(有趣的数列)(拓扑排序)
- Educational Codeforces Round 12 A. Buses Between Cities 水题
- April Fools Day Contest 2016 D. Rosetta Problem
- 函数中的 arguments 对象
- 无线遥控器方案 Si4010/Si4012
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析和开发示例
- 关于NAND flash的MTD分区与uboot中分区的理解
- 淘宝API开发第一步
- <;三>;年编程经验、何去何从?
- [翻译] TSActivityIndicatorView 自定义指示器