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(); } });