TreeSet Set 接口的一种实现类 它的底层实现是基于TreeMap(底层实现的数据结构是树结构,并不是由TreeMap实现)
它的内部存储时是有序的,使其有序的方法是compareTo(),每次存储时都会调用被存储对象的compareTo()与已经存在的对象做比较,如果返回值为0则代表两个
对象相等,则此对象不会被存入到set中,(基本数据类型比较的是真实值,但自己写的类则是比较的地址,如果想要按他们的真实值进行比较则需要自己重写compareTo方法)
重写compareTo()方法需要实现接口Comparable
此实现提供了基本的操作(保证的log(n)时间成本add, remove和contains)。
需要注意的是由一组(无论是否提供了明确的比较器)保持的顺序必须与equals一致
,如果它是要正确实现Set接口。(参见Comparable或Comparator为一致的精确定义与equals)。这是因为该Set接口在来定义equals的操作,但一个TreeSet例如使用其执行所有元件比较compareTo(或compare)方法,于是两个通过该方法认为相等的元素从集合的角度来看是相等的。
集合的行为是明确定义的,即使其排序与equals不一致;它只是没有遵守Set界面的总体合同。
请注意,此实现不同步。
如果多个线程并发访问树,并且至少有一个线程修改该集合,则必须
在外部进行同步。
这通常通过在自然地封装集合的一些对象上进行同步来实现。
如果没有这样的对象存在,那么该集合应该使用Collections.synchronizedSortedSet方法“包装”。
这最好在创建时完成,以防止对该集合的意外不同步访问:
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
该类iterator方法返回的迭代器是故障快速的:如果在迭代器创建之后的任何时间对该集合进行了修改,除了通过迭代器自己的remove方法之外,迭代器将抛出一个ConcurrentModificationException。
请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。
因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。
对于比较汉字时会出现故障所以用适用当前环境的类进行比较
Collator collator= Collator.getInstance();
CollationKey key = collator.getCollationKey(this.name);
CollationKey key2 = collator.getCollationKey(o.name);
int num = key.compareTo(key2);
public int compareTo(Person o) {
// 需要有 两个条件
//成绩 第一条件排序
if(this.grade>o.grade){
return -1;
}else if(this.grade<o.grade){
return 1;
}else{
// 就是成绩相同的时候 开始比较年龄
// 年龄升序
if(this.age>o.age){
return 1;
}else if(this.age <o.age){
return -1;
}else{
// 成绩 年龄都相同的时候 比较第三条件 姓名
//int num= this.name.compareTo(o.name);// String 类中 的 compareTo方法 已经被重写过了 升序排序
// String 中重写 compareTo 并不适用与 汉字
// 适应当前环境的 类 帮助比较String 字符串
// compareTo 默认升序排序
Collator collator = Collator.getInstance();
CollationKey key = collator.getCollationKey(this.name);
CollationKey key2 = collator.getCollationKey(o.name);
int num = key.compareTo(key2);
return -num;
}
}
// return 0;
}