TreeSet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeSet相关的知识,希望对你有一定的参考价值。

TreeSet是SortedSet接口实现的类. TreeSet保证了遍历时的有序性.TreeSet就是红黑树.

添加时,从根结点开始比较,确定插入左子树还是右子树,这是个比较的过程. 所以

(1) 添加的对象必须自身继承Comparable接口,实现compareTo(Object obj),比如基本数据类型的包装类,String类,Date类,Time类.

(2)CompareTo比较的原则可以自定义,自定义的叫定制排序,纯粹比较大小的叫自然排序.

 1 import java.util.*;
 2 public class TestJava {
 3     public static void main(String[] args) {
 4         OkHasComparable a1 = new OkHasComparable(2);
 5         OkHasComparable a2 = new OkHasComparable(1);
 6         OkHasComparable a3 = new OkHasComparable(3);
 7         OkHasComparable a4 = new OkHasComparable(3);
 8         
 9         TreeSet c = new TreeSet();
10         
11         c.add(a2); c.add(a1); c.add(a3); c.add(a4);
12         
13         Iterator it = c.iterator();
14         while(it.hasNext()) {
15             OkHasComparable ohc = (OkHasComparable)it.next();
16             System.out.println(ohc.i);
17         }
18         
19         System.out.print(c); System.out.println();
20         
21         System.out.println(c.first());
22         System.out.println(c.last());
23     }
24 }
25 
26 class ErrorNoComparable {
27     
28 }
29 /*
30 Interface ErrorNoCompareTo implements Comparable {
31     
32 }*/
33 
34 class OkHasComparable implements Comparable {
35     int i;
36     
37     public OkHasComparable(int i) {
38         this.i = i;
39     }
40     
41     public int compareTo(Object obj) {
42         
43             OkHasComparable ahc = (OkHasComparable)obj;
44             /*缺少检查类型检查模块,以后会写了再写*/
45           if(ahc.i == this.i) return 0;
46           else if(ahc.i < this.i) return this.i - ahc.i;
47           else return ahc.i - this.i;
48     }
49     public String toString() {
50         return this.i + "";
51     }
52 }

运行结果:

1
2
3
[1, 2, 3]
1
3

compareTo方法三要素:(1) 同类型(会发生向下转型) (2) 相等返回0 ,大于返回+ 小于返回 - 

TreeSet比较的是关键字,而不是对象整体,只要关键字相同便已经不能添加,即使equals不相等,也不能添加. equals相等,但是compareTo返回0,那它就是无法添加,TreeSet相不相等不看equals.

TreeSet每次插入新元素都会执行compareTo方法,要想安全使用TreeSet,就要遵守: 存放同一类型的对象.

对于TreeSet来说,相等元素不能再存放,相等标准 compareTo返回0.

注意两点: 若equals方法相等,也要保证compareTo方法相等. 若compareTo相等,但是equals不相等,与Set性质相悖.

不要修改已经入了容器的元素.

 

定制排序: compareTo方法,自定义关键字比较方法,你认为两个关键字相等就想等,谁大谁就大.

 

以上是关于TreeSet的主要内容,如果未能解决你的问题,请参考以下文章

[Java基础]TreeSet集合概述和特点

java中treemap和treeset实现(红黑树)

Java集合框架 Set接口实现类--TreeSet概述及使用

Java集合框架 Set接口实现类--TreeSet补充: Comparator接口

关于java中TreeSet类的一些问题

Java集合详解7:HashSet,TreeSet与LinkedHashSet