首页 > 代码库 > java中TreeSet集合如何实现元素的判重

java中TreeSet集合如何实现元素的判重

  1 /*  2 看一下部分的TreeSet源码....  3 public class TreeSet<E> extends AbstractSet<E>  4     implements NavigableSet<E>, Cloneable, java.io.Serializable  5 {  6     private transient NavigableMap<E,Object> m;  7     //NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现  8     private static final Object PRESENT = new Object();  9  10     TreeSet(NavigableMap<E,Object> m) { 11         this.m = m; 12     } 13     ////第一种构造方法 14     public TreeSet(Comparator<? super E> comparator) { 15         this(new TreeMap<>(comparator)); 16     } 17     ////第二种构造方法 18     public TreeSet() { 19         this(new TreeMap<E,Object>()); 20     } 21     .......... 22     public boolean add(E e) { 23         return m.put(e, PRESENT)==null; 24  25     /* 26         再看一下 TreeMap 中是如何实现的 put()函数的 27         public V put(K key, V value) { 28         Entry<K,V> t = root; 29         if (t == null) { 30             compare(key, key); // type (and possibly null) check 31  32             root = new Entry<>(key, value, null); 33             size = 1; 34             modCount++; 35             return null; 36         } 37         int cmp; 38         Entry<K,V> parent; 39         // split comparator and comparable paths 40         Comparator<? super K> cpr = comparator; 41         if (cpr != null) { 42             do { 43                 parent = t; 44                 cmp = cpr.compare(key, t.key); 45                 if (cmp < 0) 46                     t = t.left; 47                 else if (cmp > 0) 48                     t = t.right; 49                 else 50                     return t.setValue(value); 51             } while (t != null); 52         } 53         else { 54             if (key == null) 55                 throw new NullPointerException(); 56             Comparable<? super K> k = (Comparable<? super K>) key; 57             do { 58                 parent = t; 59                 cmp = k.compareTo(t.key); 60                 if (cmp < 0) 61                     t = t.left; 62                 else if (cmp > 0) 63                     t = t.right; 64                 else 65                     return t.setValue(value); 66             } while (t != null); 67         } 68         Entry<K,V> e = new Entry<>(key, value, parent); 69         if (cmp < 0) 70             parent.left = e; 71         else 72             parent.right = e; 73         fixAfterInsertion(e); 74         size++; 75         modCount++; 76         return null; 77     } 78     */ 79     } 80 } 81  82 也就是说TreeSet内部实现使用TreeMap这个类来完成的 83 TreeSet的内部实现元素之间是否相等? 84 如果指定了Comparator(也就是利用第一种构造方法), 那么就用其中的compare方法进行比较 85 否则就用Comparable中的compareTo()方法进行元素的比较 86 */ 87  88 import java.util.*; 89 public class CompTest{ 90     public static void main(String args[]){ 91         Set<myClass> st = new TreeSet<myClass>(); 92         st.add(new myClass(1, "fd")); 93         st.add(new myClass(2, "fff")); 94         st.add(new myClass(2, "tttt")); 95         st.add(new myClass(1, "fd")); 96  97         for(Iterator<myClass> it = st.iterator(); it.hasNext();) 98             System.out.println(it.next()); 99     }100 }101 102 class myClass implements Comparable<myClass>{103 104    public int x;105    public String name;106    public myClass(int x, String name){107        this.x=x;108        this.name=name;109    }110    public int compareTo(myClass tmp){111        if(this.x==tmp.x)112           return this.name.compareTo(tmp.name);113        else return this.x-tmp.x;114    }115   116    public String toString(){117       return x+" "+name;118    }119 }