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集合框架 Set接口实现类--TreeSet概述及使用