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 }

java中TreeSet集合如何实现元素的判重,布布扣,bubuko.com

时间: 2024-12-19 03:21:53

java中TreeSet集合如何实现元素的判重的相关文章

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

java中各种集合的用法和比较

一,java中各种集合的关系图 Collection       接口的接口     对象的集合 ├ List             子接口         按进入先后有序保存   可重复 │├ LinkedList    接口实现类     链表     插入删除   没有同步   线程不安全 │├ ArrayList     接口实现类      数组     随机访问   没有同步   线程不安全 │└ Vector        接口实现类       数组              

Java中的集合框架-Map

前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从本篇开始,对集合框架里的另外一部分Map作一下记录. 一,集合框架的Map接口 Map与Collection不同之处在于它是以键值对来存储数据: Map比较常用的实现类有四个:HashTable,HashMap,LinkedHashMap,TreeMap: Map的方法也可以分为四类,增删改查,大致如下: 新

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

菜鸟日记之 java中的集合框架

java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterator接口所以具有了iterator()方法 ,该方法返回一个Iterator<T>,这个接口具有 HasNext (),next(),remove()3个方法可以在实现类里完成实现. hasNext():判断是否有下一个元素 cusor是当前的操作下标 next():读取下一个元素 remove(

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

Java 中的集合接口——List、Set、Map

Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组跟集合有什么区别: 数组:长度固定,遍历速度快 可以存储基本类型和引用类型: 集合:长度不固定,只能存储引用类型对象: 从数组跟集合的特点我们很明显的看出,数组有一定的局限性,如果我们需要不定期的往我们的数据中存储数据,数组就满足不了我们的要求. Java集合框架提供了一套性能优良.使用方便的接口和

JAVA笔记整理(九),JAVA中的集合

在工作中,我们经常需要将多个对象集中存放,可以使用数组,但是数组的长度一旦固定之后是不可变的,为了保存数量确定的数据,我们可以使用JAVA中的集合. 在我看来,JAVA中的集合可以看作是一个特殊的数据库,可以针对这个数据库进行数据的增删查改,可以查看数据库的大小,查看数据库是否为空等等. JAVA中的集合是由Collection和Map两个接口派生出来的,正因为是两个接口,所以只能通过其子类来将其实例化,下图为常用集合: Collection是List.Queue和Set接口的父接口,Map是H

Java中的集合和常用类

Java中的常用类: ? Object类 ? Math类 ? String类和StringBuffer类(字符串) ? 8种基本类型所对应的包装类 ? java.util包中的类——Date类 Object类: Object类是Java语言程序中所有类的父类,即承自Object类.Object类中包含了Java语言类中的所有的公共属性. ? toString()方法 ? equals()方法 ? getClass()方法 ? clone()方法 ? finalize()方法 枚举类: 用于储存变