我们都知道Set的集合是无序的,但是TreeSet却是一个有序的集合,在这里说的有序并不是像List集合那样有次序,这里的次序就是可以通过下标来遍历数组。TreeSet具有唯一性,相同元素只添加一次。
想要了解一个类就需要去翻api文档,如上图我们可以知道,它继承了AbstractSet这个抽象类,并且实现了如下图的接口
TreeSet的构造方法
如上图第一个构造方法是构造一个空的数组,他的元素排序是自然排序。第二个构造函数是,把一个集合传过去,生成一个TreeSet集合,其排序规则是自然排序。第三个构造方法是创建一个空的数组,按照指定的比较器进行排序。
TreeSet的排序方式
自然排序
要求这个元素所在的类实现Comparable接口,重写方法compareTo()
方法,
this==0相等,不会添加元素
this >obj ,添加到原来对象的右边
this>obj //添加到原来对象的左边
缺点:排序方式固定,无法更改,不灵活
举个自然排序的例子:
public class User implements Comparable{
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
//比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1
User user = (User)o;
if(this.age > user.age){
return 1;
}else if(this.age<user.age){
return -1;
}else{
return this.name.compareTo(user.name);
}
}
}
当插入多个User对象了之后就会根据年龄的大小进行排序。
指定排序
不需要元素所在类,实现comparator接口,需要传递comparator接口。
不需要元素所在的类实现接口,根据指定比较器的指定排序规则进行排序。在使用的时候创建一个comparator的实现类,在构造这个类的时候加载我们创建的comparator实现类。
TreeSet treeSet1 = new TreeSet(new Comparator() { //匿名内部类
@Override
//o1 新添加的元素 o2旧的元素
public int compare(Object o1, Object o2) {
Student stu1 = (Student)o1;
Student stu2 = (Student)o2;
if (stu1.equals(stu2)){
return 0;
}
if (stu1.getAllScore()==stu2.getAllScore()){
return 1;
}
return stu2.getAllScore() - stu1.getAllScore();
}
});
String,八大基本数据类型的包装类已经实现了comparator接口,可以把,String与,包装类的数据直接添加到TreeSet,帮我们自然排序。
如果一个元素所在的类既没有实现comparator,而又没有传递comparator接口,程序会抛出异常