- 说明
Java提供了两种TreeSet的排序规则,分别为自然排序和自定义排序。在默认情况下,TreeSet集合都是采用自然排序。 - 自然排序
自然排序要求向TreeSet集合中存储的元素所在类必须实现Comparable接口,并重写compareTo()方法,然后TreeSet集合就会对该类型元素使用compareTo()方法进行比较。compareTo()方法将当前对象(this)与指定的对象进行顺序比较,返回值为一个整数,其中返回负整数、零或正整数分别表示当前对象小于、等于或大于指定对象,默认根据比较结果顺序排列。 - 自定义排序
如果不想实现Comparable接口或者不想按照实现了Comparable接口的类中compareTo()方法的规则进行排序,可以通过自定义比较器的方式对TreeSet集合中的元素自定义排序规则。实现Comparator接口的类都是一个自定义比较器,可以在自定义比较器中的compare()方法中自定义排序规则。
比喻下面的测试案例,在TreeSet集合中自定义排序,排序规则是先根据Student的age降序排列,如果age相同则根据name进行降序排列
步骤一:创建Student类。
步骤二:定义main()方法 ,创建一个TreeSet集合并通过匿名内部类的方式实现了Comparator接口,在内部类中重写了Comparator接口的compare()方法。 - 测试类
import entity.Student;
import java.util.TreeSet;
/**
* TreeSet 测试
* @author : ZhouMei
* @date Date : 2022年08月11日 10:31
* @Description: TODO
*/
public class TreeSetTest {
public static void main(String[] args) {
//使用默认比较器
TreeSet set = new TreeSet();
/*
//自定义比较器
TreeSet set = new TreeSet(new Comparator<Student>() {
public int compare(Student s1, Student s2) {
int num = s2.getAge() - s1.getAge();
return num!=0? num : s2.getName().compareTo(s1.getName());
}
});
*/
set.add(new Student(1, "Lucy", 18));
set.add(new Student(2, "Tom", 22));
set.add(new Student(3, "Bob", 22));
set.add(new Student(4, "Tom", 22));
System.out.println(set);
}
}
package entity;
import lombok.Data;
/**
* @author : ZhouMei
* @date Date : 2022年08月11日 10:20
* @Description: TODO
*/
@Data
public class Student implements Comparable {
private Integer id;
private String name;
private Integer age;
public int compareTo(Object o1) {
Student s1 = (Student) o1;
if(this.age > s1.age){
return 1;
}
if(this.age == s1.age){
return this.name.compareTo(s1.name);
}
return -1;
}
public Student(Integer id, String name, Integer age){
this.id = id;
this.name = name;
this.age = age;
}
}
[Student(id=1, name=Lucy, age=18), Student(id=3, name=Bob, age=22), Student(id=2, name=Tom, age=22)]