在TreeSet和TreeMap集合里元素是有序的,默认使用Comparable进行升序排序,也可以对方法进行重写满足自己需要的排序规则
Comparable用于对象的自我比较,适用于有明确自然顺序的情况。如数字的大小,字符串的字典顺序
Comparator用于外部定制比较逻辑,适用于需要自定义排序规则或类没有自然顺序的情况。
以学生类为例对Comparable进行重写,在创建类的时候重写,
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
//按照对象的年龄进行排序
//主要判断条件: 按照年龄从小到大排序
int result = this.age - o.age;
//次要判断条件: 年龄相同时,按照姓名的字母顺序排序
result = result == 0 ? this.name.compareTo(o.getName()) : result;
return result;
}
}
重写Comparato,在创建具体集合的时候进行重写
public class MyTreeSet4 {
public static void main(String[] args) {
//创建集合对象
TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
//o1表示现在要存入的那个元素
//o2表示已经存入到集合中的元素
//主要条件,判断年龄大小
int result = o1.getAge() - o2.getAge();
//次要条件,对姓名进行排序
result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
return result;
}
});
}
}