一.排序概念:
TreeSet集合底层才有红黑树算法,会对存储的元素默认使用自然排序(从小到大).
注意: 必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错.
二.自然排序:
自然排序(从小到大):
TreeSet调用集合元素的compareTo方法来比较元素的大小关系,然后讲集合元素按照升序排列(从小到大).
注意:要求TreeSet集合中元素得实现java.util.Comparable接口.
java.util.Comparable接口:可比较的.
覆盖 public int compareTo(Object o)方法,在该方法中编写比较规则.
在该方法中,比较当前对象(this)和参数对象o做比较(严格上说比较的是对象中的数据,比如按照对象的年龄排序).
this > o: 返回正整数. 1
this < o: 返回负整数. -1
this == o: 返回0. 此时认为两个对象为同一个对象.
在TreeSet的自然排序中,认为如果两个对象做比较的compareTo方法返回的是0,则认为是同一个对象.
class Person implements Comparable<Person>{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
if(this.age>o.age){
return 1;
}else if(this.age<o.age){
return -1;
}
return 0;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("赵一",20));
set.add(new Person("钱二",30));
set.add(new Person("孙三",10));
set.add(new Person("李四",15));
System.out.println(set);
//[Person{name='孙三', age=10}, Person{name='李四', age=15}, Person{name='赵一', age=20}, Person{name='钱二', age=30}]
}
}
三.定制排序:
在TreeSet构造器中传递java.lang.Comparator对象.并覆盖public int compare(Object o1, Object o2)再编写比较规则.
class Person {
String name;
Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class TreeSetDemo1 {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>(new NameComparator());
set.add(new Person("陈伊伊",20));
set.add(new Person("钱二",30));
set.add(new Person("孙三三",10));
set.add(new Person("李四四四",15));
System.out.println(set);
//[Person{name='李四四四', age=15}, Person{name='孙三三', age=10}, Person{name='陈伊伊', age=20}, Person{name='钱二', age=30}]
}
}
class NameComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
//先按照名字字数的长短来比较
if(o1.name.length()>o2.name.length()){
return -1;
}else if(o1.name.length()<o2.name.length()){
return 1;
//如果名字长短一样,再按照年龄来自然排序
}else if(o1.age>o2.age){
return 1;
}else if(o1.age<o2.age){
return -1;
}
return 0;
}
}
对于TreeSet集合来说,要么使用自然排序,要么使用定制排序.
判断两个对象是否相等的规则:
自然排序: compareTo方法返回0;
定制排序: compare方法返回0;