TreeSet是实现Set接口的实现类。 因此,存储的值是唯一的,同时也可以对存储的值进行排序。 排序时使用二叉树原理。 所以要理解这个班,首先要简单地理解什么是二叉树。
二叉树原理综述
如果有这样的集合TreeSet的话[ 5,11,6,5,23,14 ]
用二叉树怎么排序?
二叉树的遍历方法很多,感兴趣的话在百度上看看吧。 在这里,你只需要知道元素是如何插入二叉树的。 小的存储在左边(负数),大的存储在右边(正数),不相等。
TreeSet的基本使用
publicstaticvoidmain (字符串[ ] args ) {
TreeSet ts=new TreeSet (;
ts.add(2;
ts.add(1;
ts.add(3;
ts.add(2;
ts.add(3;
ts.add(1;
ts.add(2;
system.out.println(ts;
//输出结果:
[ 1,2,3 ]
可以看到,TreeSet集合不仅保证了集合元素的唯一性,而且还可以进行排序。
如果TreeSet中存储了对象呢? 会怎么样呢?
publicstaticvoidmain (字符串[ ] args ) {
TreeSet ts=new TreeSet (;
ts.add(newstudents ) )疏忽的睫毛膏)、13 );
ts.add(newstudents )“快乐信封”,14 );
ts.add(newstudents(DPdhb ),15 );
system.out.println(ts;
//输出结果:
exceptioninthread ' main ' Java.lang.classcastexception 3360 com.lei.studentscannotbecastojava.lang.com parable
错了。 集合中包含对象,因此无法将对象转换为可比较的对象。
如果想按照年龄顺序打印各个对象,该怎么办?
在API中搜索Comparable后,发现是界面。 您可以让Students类别实作Comparable介面方法,让Students物件成为可比较的物件。
Students类实现Comparable接口方法。
publicclassstudentsimplementscomparable { privatestring name; 私有增量;
.
@ overridepublicintcompareto (studentso ) {return this.age-o.age;
}
}
为什么是this.age-o.age? this.age表示调用时对象的age,如果返回的是正数(大于o.age ),则存储在右边。 如果返回的是负数(小于o.age ),则存储在左侧。 0表示不保存。
这是个问题。 如果两个人是不同的名字,年龄相同,this.age - o.age=0的话,不是就不进二叉树了吗?
验证一下:
publicstaticvoidmain (字符串[ ] args ) {
TreeSet ts=new TreeSet (;
ts.add(newstudents )“快乐信封”,14 );
ts.add(newstudents ) )疏忽的睫毛膏)、13 );
ts.add(newstudents(DPdhb ),15 );
ts.add(newstudents(ssDBD ),13 );
system.out.println(ts;
//输出结果只有疏忽的睫毛膏、快乐的信封、dpdhb
所以,有必要改善Students系的compareTo方法,保证相同的年龄,但是不同名字的学生也可以加入二叉树。
@ overridepublicintcompareto (studentso ) {int num=this.age -o.age; //String类中的compareTo方法//int compare to (stringanotherstring )被重写为按词典顺序比较两个字符串
返回编号==0? this.name.comPareto(o.name ) : num;
这样就可以保存四个不同的对象,按年龄排序,按字符串对年龄相同的对象进行排序。
除了可以用这种方法排序外,还有一种方法可以排序。
TreeSet提供了以下构建方法:
treeset (comparatorsuperecomparator )创建新的空树集,并根据指定的比较器对其进行排序。
Comparator是什么? 查看API文档:
Interface Comparator是包含要实现的接口方法的接口。
intcompare(to1,T o2 )比较这两个参数的顺序。
例如,对字符串的长度进行排序,对同样长度的安装字符串进行排序。
public class test5{ publicstaticvoidmain (string [ ] args ) }
treeset ts=new treeset (newsortedbylen (); //父类引用是子类对象Comparator c=new SortedByLen (;
ts.add(aaaaaaaaa );
ts.add(WC );
ts.add(NBA );
ts.add(CBA );
ts.add(chichung );
system.out.println(ts;
}
} classsortedbylenimplementscomparator {
@ overridepublicintcompare (stringo 1,String o2 ) ) {int num=o1.length )-o2.length ); 返回编号==0? O1.comPareto(O2 ) : num;
}
//输出结果:
[wc,cba,nba,chichung,aaaaaaaaa]
需要注意的是重写compare方法的o1、o2。 o1表示要调用的对象,o2表示集合中的对象。
两种实现排序方法根据情况使用。
(1)自然顺序(Comparable ) ) )。
TreeSet类的add ) )方法将保存的对象提升为Comparable类型
将调用对象的compareTo ()方法与集合中的对象进行比较
compareTo ) )基于从方法返回的结果进行保存
(2)比较器顺序(Comparator ) ) ) ) )。
可以在创建TreeSet时指定Comparator
如果传递了Comparator子类的对象,则TreeSet将按比较器中的顺序排序
的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
)3)两种方式的不同
不传递任何TreeSet构造函数,缺省情况下为类中的Comparable。 (如果没有,则将ClassCastException报告为错误。 )
TreeSet在传递给Comparator后,优先遵循Comparator
如果不想保证元素的唯一性,只需更改compare方法即可,绝对不要将其还原为0。