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;//比较年龄次要条件 }