TreeSet主要用于排序,底层用二叉树实现
* 1.特点
* TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
* 2.使用方式
* a.自然顺序(Comparable)
* TreeSet类的add()方法中会把存入的对象提升为Comparable类型
* 调用对象的compareTo()方法和集合中的对象比较
* 根据compareTo()方法返回的结果进行存储
* b.比较器顺序(Comparator)
* 创建TreeSet的时候可以制定 一个Comparator
* 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
* add()方法内部会自动调用Comparator接口中compare()方法排序
* 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
* c.两种方式的区别
* TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
* TreeSet如果传入Comparator, 就优先按照Comparator
person类:(setter 和getter已忽略 )
public class Person implements Comparable<Person>{
private String name;
private int age;
测试类中:
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("a",1));
ts.add(new Person("b",3));
ts.add(new Person("b",3));
ts.add(new Person("c",2));
System.out.println(ts);
/**
* Person实现Comparable接口
*/
public class Person implements Comparable<Person>{
}
/*
* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
* 0 一个元素
* 1 正序输出
* -1逆序输出
*/
根据年龄排序:
public int compareTo(Person o) {
int number = this.age - o.age;
return number == 0?this.name.compareTo(o.name) : number;
}
根据姓名Unicode排序:
/**
* 按照姓名UniCode排序
*/
@Override
public int compareTo(Person o) {
int num = this.name.compareTo(o.name);
return num == 0?this.age - o.age:num;
}
根据姓名长度排序
/**
* 按照姓名长度排序
*/
@Override
public int compareTo(Person o) {
int length = this.name.length() - o.name.length();//比较长度为主要条件
int num = length == 0? this.name.compareTo(o.name) : length;//比较内容为次要条件
return num == 0? this.age - o.age : num;//比较年龄次要条件
}