开发者社区> hujunzheng> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 1 /* 2 看一下部分的TreeSet源码.... 3 public class TreeSet extends AbstractSet 4 implements NavigableSet, Cloneable, java.
+关注继续查看
  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】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(下)
43 0
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(上)
【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)(上)
47 0
JAVA和PYTHON同时实现AES的加密解密操作---且生成的BASE62编码一致
终于有机会生产JAVA的东东了。 有点兴奋。 花了一天搞完。。 java(关键key及算法有缩减): package com.security; import javax.crypto.
1851 0
Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
/** * Created by LiuHuiChao on 2016/11/15. * description:based on TCP/IP+NIO to deliver the message */ public class TCP_IP_NIO { @Test ...
945 0
Java——基于java自身包实现消息系统间的通信(TCP/IP+BIO)
          最近看到阿里的一位童鞋写的一本关于分布式的书,感觉不错,准备把这本书上基础的代码都写一写。 /** * Created by LiuHuiChao on 2016/11/15.
890 0
【JAVA秒会技术之加密】3DES(TripleDES)实现跨平台统一加密
3DES(TripleDES)实现跨平台统一加密 一、3DES简介 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是使用3条56位的密钥对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种
1813 0
Java实现内部类
内部类是java中非常方便的一种机制,内部类所在的类称为宿主类,即内部类只能被它的宿主类使用,用这个特性,可以很好的控制类的可见性。 接下来看一个例子: package for_apro; import java.
673 0
Java SpringMVC实现PC端网页微信扫码支付完整版
一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现。其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.
1299 0
熟悉java语言的基本使用:简单存款取款机制java实现
最近一直没有项目做,于是我也不能这样闲着,我得开始学习新的技术,并且巩固以前自学的技术。以下就是我写的一个简单的java存取款代码,很简单,可能还有更简单的方法,目的是为了熟悉java的基本使用。 package arraysss; import java.
888 0
+关注
hujunzheng
java核心技术专家
444
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载