集合特点:排序和唯一。
若传入的都是Integer类型的元素,TreeSet会自动排序
若传入的是对象,需要自定义排序方法
两种排序方式:
- 自然排序
- 比较器排序
使用元素的自然排序对元素进行排序,还是根据创建集合时提供的Comparator比较器进行排序,这取决于使用的构造方法。
真正比较的是依赖元素的compareTo()方法,而这个方法是定义在Comparable里面的。所以,你要想重写此方法。就必须是先实现Comparable接口。
由于在Integer类本身已实现了Comparable接口,重写了compare()方法,所以传入Integer类型的数时TreeSet实现类就会自动排序,而传入对象时,TreeSet实现类不知道以某种方式排序,此时就需要我们来从写排序方法。
Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,这个排序称为自然排序。
Comparable接口的方法:intcompareTo(To)将此对象与指定的对象进行比较以进行排序。参数o-要比较的对象。结果负整数,零或正整数,因为该对象小于,等于或大于指定对象。
数据排序原理
元素是如何存储进去的?
TreeSet集合底层数据结构是红黑树(平衡二叉树)。
第一个元素存储的时候,直接作为根节点。
从第二个开始,每个元素从根节点开始比较:
大——就作为右孩子
小——就作为左孩子
相等——不搭理它
实例:
/*
* TreeSet 唯一性,排序
*/
public class DeomeTreeSet {
public static void main(String[] args) {
//TreeSet 集合对象
TreeSet<Integer> ts =new TreeSet<Integer>();
ts.add(23);
ts.add(14);
ts.add(4);
ts.add(78);
ts.add(45);
//遍历
for (Integer itg:ts) {
System.out.println(itg);
}
TreeSet<Stus > ts1 =new TreeSet<Stus>();
//创建元素对象
Stus s1 =new Stus("zhangsan",12);
Stus s2 =new Stus("lishi",15);
Stus s3 =new Stus("wangwu",16);
Stus s4 =new Stus("tianqi",19);
ts1.add(s1);
ts1.add(s2);
ts1.add(s3);
ts1.add(s4);
//遍历
for (Stus itg:ts1) {
System.out.println("姓名:"+itg.name+",年龄:"+itg.age);
}
}
}
class Stus {
String name;
int age;
public Stus(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
运行结果:
如图显示:TreeSet可以实现integer类型的排序,但是对Stus类型的就没办法排序,因为计算机不知道以某种方式排序就会报错。
这时我们就要自定义排序方法。
第一种自然排序:
- 在类Stus中实现Comparable接口
- 重写Comparable接口中的Compareto方法
如:修改类Stus实现Comparable()接口
class Stus implements Comparable<Stus> {
String name;
int age;
public Stus(String name, int age) {
super();
this.name = name;
this.age = age;
}
//重写compareTo方法
@Override
public int compareTo(Stus o) {
//以年龄大小排序
return this.age-o.age;
}
}
第二种比较器排序:
比较器排序步骤:
- 单独创建一个比较类,这里以MyComparator为例,并且要让其继承
Comparator接口 - 重写Comparator接口中的Compare方法
intcompare(To1,To2)比较用来排序的两个参数 - 在主类中使用下面的构造
TreeSet(Comparatorcomparator)
构造一个新的空TreeSet,他根据指定比较器进行排序
例如:
//写个工具类
class MyCompara implements Comparator<Stus>{
@Override
public int compare(Stus o1, Stus o2) {
return o1.age-o2.age;
}
}
之后再添加:
运行结果如上图.