java中的TreeSet的add()方法解析

TreeSet的add()方法解析【添加和去重】

  1 public class HomeWork05 {
  2     public static void main(String[] args) {
  3         // TreeSet最好是同一类型。
  4 //        TreeSet treeSet = new TreeSet();
  5         // TreeSet可以定义排序【匿名内部类作为参数,实现Compare接口】
  6         TreeSet treeSet = new TreeSet(new Comparator() {
  7             @Override
  8             public int compare(Object o1, Object o2) {
  9                 return ((String) o1).compareTo((String) o2);
 10             }
 11         });
 12         treeSet.add("hello");
 13         treeSet.add("world");
 14         treeSet.add(new String("hello"));
 15 //        treeSet.add(new A(10));
 16 //        treeSet.add(new A(20));
 17 
 18         Iterator iterator = treeSet.iterator();
 19         while (iterator.hasNext()) {
 20             Object obj = iterator.next();
 21             System.out.println(obj);
 22         }
 23 
 24         /**
 25          * TreeSet无参构造器:
 26          *     public TreeSet() {
 27          *         this(new TreeMap<E,Object>());
 28          *     }
 29          *     public TreeMap() {
 30          *         comparator = null;
 31          *     }
 32          * 可见TreeSet的底层是TreeMap。
 33          *
 34          * 解析add():
 35          * 1) public boolean add(E e) {
 36          *         return m.put(e, PRESENT)==null;
 37          *     }
 38          *     $ PRESENT是value的固定值,主要是按照key的值存储。
 39          *
 40          * 2) public V put(K key, V value) {
 41          *         Entry<K,V> t = root;
 42          *         // 首次进入put()方法,root为空
 43          *         // 将第一次添加的key,作为root根节点
 44          *         if (t == null) {
 45          *             compare(key, key);
 46          *             root = new Entry<>(key, value, null);
 47          *             size = 1;
 48          *             modCount++;
 49          *             return null;
 50          *         }
 51          *         int cmp;
 52          *         Entry<K,V> parent;
 53          *         Comparator<? super K> cpr = comparator;
 54          *         // 遍历红黑树,compare()比较,两对象是否相同
 55          *         // 若在红黑树中没有相同的key,就添加key;
 56          *         // 若在红黑树中有相同的key,将红黑树中的key对应的value值,替换成添加的key对应的value值。
 57          *         if (cpr != null) {
 58          *             do {
 59          *                 parent = t;
 60          *                 cmp = cpr.compare(key, t.key);
 61          *                 if (cmp < 0)
 62          *                     t = t.left;
 63          *                 else if (cmp > 0)
 64          *                     t = t.right;
 65          *                 else
 66          *                     return t.setValue(value);
 67          *             } while (t != null);
 68          *         }
 69          *         else {
 70          *             if (key == null)
 71          *                 throw new NullPointerException();
 72          *                 Comparable<? super K> k = (Comparable<? super K>) key;
 73          *             // 遍历红黑树,根据自定义对象的compareTo()比较,两对象是否相同
 74          *             // 若在红黑树中没有相同的key,就添加key;
 75          *             // 若在红黑树中有相同的key,将红黑树中的key对应的value值,替换成添加的key对应的value值。
 76          *             do {
 77          *                 parent = t;
 78          *                 cmp = k.compareTo(t.key);
 79          *                 if (cmp < 0)
 80          *                     t = t.left;
 81          *                 else if (cmp > 0)
 82          *                     t = t.right;
 83          *                 else
 84          *                     return t.setValue(value);
 85          *             } while (t != null);
 86          *         }
 87          *         Entry<K,V> e = new Entry<>(key, value, parent);
 88          *         if (cmp < 0)
 89          *             parent.left = e;
 90          *         else
 91          *             parent.right = e;
 92          *         fixAfterInsertion(e);
 93          *         size++;
 94          *         modCount++;
 95          *         return null;
 96          *     }
 97          *
 98          * 3) final int compare(Object k1, Object k2) {
 99          *         return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
100          *             : comparator.compare((K)k1, (K)k2);
101          *     }
102          *    $ 比较k1和k2,① 用TreeMap的comparator比较器比较,② 用传入对象的compareTo()方法进行比较。
103          */
104     }
105 }
106 
107 // 实现Compare接口的compareTo()方法
108 class A implements Comparable{
109     private int num;
110 
111     public A(int num) {
112         this.num = num;
113     }
114 
115     @Override
116     public int compareTo(Object o) {
117         return this.num - ((A) o).num;
118     }
119 }

 

posted @ 2023-01-03 15:35  zwGitOne  阅读(73)  评论(0编辑  收藏  举报