Java集合类Treeset实现细节

来源:互联网 发布:c语言中的延时函数 编辑:程序博客网 时间:2024/06/04 20:00

一、TreeSet定义

TreeSet同样是基于TreeMap实现的,我们知道TreeMap是一个有序的二叉树,那么同理TreeSet同样也是一个有序的,它的作用是提供有序的Set集合。通过源码我们知道TreeSet基础AbstractSet,实现NavigableSet、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。NavigableSet是扩展的 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法,这就意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。Cloneable支持克隆,Serializable支持序列化。

public class TreeSet<E> extends AbstractSet<E>    implements NavigableSet<E>, Cloneable, java.io.Serializable          

同时在TreeSet中定义了如下几个变量。

private transient NavigableMap<E,Object> m;        //PRESENT会被当做Map的value与key构建成键值对 
private static final Object PRESENT = new Object();
 
构造方法摘要TreeSet()           构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。TreeSet(Collection<? extends E> c)           构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。TreeSet(Comparator<? super E> comparator)           构造一个新的空 TreeSet,它根据指定比较器进行排序。TreeSet(SortedSet<E> s)           构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。 
TreeSet使用细节      

1、TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。

3、同时也可以创建comparator比较器,对其中的compare()函数进行覆写,使得TreeSet按照一定的规则来排序

 
实现comparable接口
  1. public class TreeSetTest {  
  2.     public static void main(String args[]){  
  3.         Persontest per1 = new Persontest("zhangsan"33);  
  4.         Persontest per2 = new Persontest("lisi"33);  
  5.         Persontest per3 = new Persontest("wangwu"22);  
  6.         Persontest per4 = new Persontest("zhaoliu"44);  
  7.           
  8.         TreeSet treeSet=new TreeSet();    
  9.           
  10.         treeSet.add(per1);  
  11.         treeSet.add(per2);  
  12.         treeSet.add(per3);  
  13.         treeSet.add(per4);  
  14.   
  15.         Iterator iterator=treeSet.iterator();    
  16.         while(iterator.hasNext()){    
  17.             Persontest t=(Persontest) iterator.next();    
  18.             System.out.println(t.getName()+"的年纪是"+t.getAge());    
  19.         }    
  20.     }  
  21. }  
  22.   
  23. class Persontest implements Comparable{  
  24.     private String name;  
  25.     private int age;  
  26.     public void setName(String name){  
  27.         this.name = name;  
  28.     }  
  29.       
  30.     public void setAge(int age){  
  31.         this.age = age;  
  32.     }  
  33.       
  34.     public String getName(){  
  35.         return this.name;  
  36.     }  
  37.       
  38.     public int getAge(){  
  39.         return this.age;  
  40.     }  
  41.       
  42.     public Persontest(String name, int age){  
  43.         this.name = name;  
  44.         this.age = age;  
  45.     }  
  46.       
  47.     public int compareTo(Object obj){  
  48.         Persontest per = (Persontest) obj;  
  49.         if(per.age < this.age){  
  50.             return -1;  
  51.         }  
  52.         if(per.age > this.age){  
  53.             return 1;  
  54.         }  
  55.         if(per.age == this.age){  
  56.             return this.name.compareTo(per.name);  
  57.         }  
  58.         return 0;  
  59.     }  
  60. }  
 
实现comparator接口    
  1. // 需要在类中新建一个自己的比较器  
  2. public class TreeSetTest2 {  
  3.     public static void main(String args[]){  
  4.           
  5.         TreeSet ts = new TreeSet(new Human.Comp());  
  6.         ts.add(new Human("zhangsan"33));  
  7.         ts.add(new Human("lii"44));  
  8.         ts.add(new Human("wangwu"33));  
  9.         ts.add(new Human("zhuliu"55));  
  10.           
  11.         Iterator it = ts.iterator();  
  12.         while(it.hasNext()){  
  13.             System.out.println(it.next());  
  14.         }  
  15.     }  
  16. }  
  17.   
  18. class Human{  
  19.     private String name;  
  20.     private int age;  
  21.     public Human(String name, int age){  
  22.         this.name = name;  
  23.         this.age = age;  
  24.     }  
  25.     public String toString(){  
  26.         return "姓名:"+name+" 年龄:"+age;  
  27.     }  
  28.       
  29.     static class Comp implements Comparator{  
  30.         public int compare(Object ob1, Object ob2){  
  31.             Human h1 = (Human)ob1;  
  32.             Human h2 = (Human)ob2;  
  33.             int result = h1.age > h2.age ? 1 :(h1.age == h2.age ? 0 : -1);  
  34.             if(result == 0){  
  35.                 result = h1.name.compareTo(h2.name);  
  36.             }  
  37.             return result;  
  38.         }  
  39.     }   
0 0