TreeSet进行排序的方法的方法有两种,分别是
一种是类实现Comparable<>方法,重写compareTo(Object o)方法
public class Demo1 {
public static void main(String[] args) {
Student s1 = new Student("张三",25);
Student s2 = new Student("李四",18);
Student s3 = new Student("王五",20);
//Student类实现Comparable接口,TreeSet就可以对学生进行自然排序
TreeSet<Student> ts = new TreeSet<>();
ts.add(s1);
ts.add(s2);
ts.add(s3);
for(Student s : ts){
System.out.println(s);
}
}
}
//学生类实现Comparable接口,TreeSet就可以对学生进行自然排序
public class Student implements Comparable<Student>{
private String name;
private int age;
//实现元素排序的规则
/*
根据返回值排序
返回的负数,认为当前要存入的元素比较小,存左边
返回的正数,认为当前要存入的元素比较大,存右边
返回的0,认为当前要存入的元素已经存在,不存入
*/
@Override
public int compareTo(Student o) {
//按照年龄升序排序 (从小到大)
return this.age - o.age;
//按照年龄降序排序(从大到小)
//return o.age - this.age;
}
底层原理是:
CompareTo(Student o){ return =this.age-o.age }:根据类型进行比较
例如三个学生对象,第一个存进去,第二个跟第一个比较,如果比较后为负数,则在左边存储,第三个先跟第一个比较,如果为负数则存进左边,如果为正数,然后就跟第二个对象比较,也是负数存左边,正数存右边
返回的是负数:认为当前要存入的元素比较小,存黑红树左边
返回的是正数:认为当前要存入的元素比较大,存黑红树右边
返回的是0:认为当前要存入的元素已经存在,不存入
另一种为:Comparetor比较器
方式:TreeSet<Student> a = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();
}
});
当属性不是int,而是double时,不能强制,因为会有精度问题,应该用if条件判断这个数到底是正数负数还是0
原理跟CompareTo方法是一样的,都是根据返回值来计算