java中TreeSet集合如何实现元素的判重
2014-06-29 11:20
453 查看
/* 看一下部分的TreeSet源码.... public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable { private transient NavigableMap<E,Object> m; //NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现 private static final Object PRESENT = new Object(); TreeSet(NavigableMap<E,Object> m) { this.m = m; } ////第一种构造方法 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } ////第二种构造方法 public TreeSet() { this(new TreeMap<E,Object>()); } .......... public boolean add(E e) { return m.put(e, PRESENT)==null; /* 再看一下 TreeMap 中是如何实现的 put()函数的 public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { compare(key, key); // type (and possibly null) check root = new Entry<>(key, value, null); size = 1; modCount++; return null; } int cmp; Entry<K,V> parent; // split comparator and comparable paths Comparator<? super K> cpr = comparator; if (cpr != null) { do { parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } else { if (key == null) throw new NullPointerException(); Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else parent.right = e; fixAfterInsertion(e); size++; modCount++; return null; } */ } } 也就是说TreeSet内部实现使用TreeMap这个类来完成的 TreeSet的内部实现元素之间是否相等? 如果指定了Comparator(也就是利用第一种构造方法), 那么就用其中的compare方法进行比较 否则就用Comparable中的compareTo()方法进行元素的比较 */ import java.util.*; public class CompTest{ public static void main(String args[]){ Set<myClass> st = new TreeSet<myClass>(); st.add(new myClass(1, "fd")); st.add(new myClass(2, "fff")); st.add(new myClass(2, "tttt")); st.add(new myClass(1, "fd")); for(Iterator<myClass> it = st.iterator(); it.hasNext();) System.out.println(it.next()); } } class myClass implements Comparable<myClass>{ public int x; public String name; public myClass(int x, String name){ this.x=x; this.name=name; } public int compareTo(myClass tmp){ if(this.x==tmp.x) return this.name.compareTo(tmp.name); else return this.x-tmp.x; } public String toString(){ return x+" "+name; } }
相关文章推荐
- Java学习疑点(6)--Set集合添加元素时底层如何实现无重复元素?
- 循环的时候如何安全地删除java集合的元素
- Java中如何循环删除一个集合(如List)中的多个元素
- java实现高效的枚举元素集合示例
- Java实现高效的枚举元素集合
- 集合框架(四)如何使用以及何时使用HashSet、LinkedHashSet或者TreeSet来存储元素
- 如何删除JAVA集合中的元素
- Java中如何循环删除一个集合(如List)中的多个元素
- java-集合类(3)-实现比较器(Comparator)接口-LinkedList针对插入删除、开始处增加元素
- 黑马程序员——java基础——Java集合中TreeSet实现元素唯一性的方法
- java 程序里如何实现从一个列表中拖动一个元素到另一个列表中?
- Java中如何循环删除一个集合(如List)中的多个元素
- Java中如何循环删除一个集合(如List)中的多个元素
- 【java】如何实现集合的遍历
- 如何删除JAVA集合中的元素
- Java中如何循环删除一个集合(如List)中的多个元素
- 删除JAVA集合中元素的实现代码
- Java如何随机取出集合中的元素
- 如何实现在遍历集合的过程中删除其中的元素
- Java中如何删除一个集合中的多个元素