书店网站建设定位及目标seo推广外包报价表
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;}@Overridepublic 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;
//***********省略同上部分内容*******************@Overridepublic int compareTo(StudentT o) {return this.Id-o.Id;//选择你需要的排序内容,返回值大于0表示是升序}
}
TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。(优先级更高)
Set<StudentT> ste2=new TreeSet<>(new Comparator<StudentT>() {@Overridepublic int compare(StudentT o1, StudentT o2) {return o1.getId()-o2.getId();}});