TreeSet的特点:可排序、不重复、无索引。
可排序:按照元素的大小默认升序排序;底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
对于数值、字符串类型的(Integer 、Double、String)TreeSet可以排序,而对于自定义类型对象就不能直接排序。
示例1:
对于以下类:
class StudentT {
int Id;
String name;
int age;
public StudentT(int Id,String name,int age){
this.Id=Id;
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "StudentT{" +
"Id=" + Id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
创建以下有重复对象,使用TreeSet:
Set<StudentT> ste2=new TreeSet<>();
StudentT s1=new StudentT(1201,"李白",19);
ste2.add(new StudentT(1201,"李白",19));
ste2.add(new StudentT(1230,"李思",18));
ste2.add(new StudentT(1206,"张三",19));
ste2.add(new StudentT(1201,"李白",19));
System.out.println(ste2);
运行结果:
Exception in thread "main" java.lang.ClassCastException: class set_1.StudentT cannot be cast to class java.lang.Comparable (set_1.StudentT is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base/java.util.TreeMap.compare(TreeMap.java:1569)
*****************************
at set_1.TreeSet1.main(TreeSet1.java:22)
这就是说:想要使用TreeSet存储自定义类型,需要制定排序规则
自定义排序规则(两种)
让自定义的类实现Comparable接口重写里面的compareTo方法来定制比较规则。
class StudentT implements Comparable<StudentT>{
int Id;
//***********省略同上部分内容*******************
@Override
public int compareTo(StudentT o) {
return this.Id-o.Id;//选择你需要的排序内容,返回值大于0表示是升序
}
}
TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。(优先级更高)
Set<StudentT> ste2=new TreeSet<>(new Comparator<StudentT>() {
@Override
public int compare(StudentT o1, StudentT o2) {
return o1.getId()-o2.getId();
}
});