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

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

简介:
+关注继续查看

/*
看一下部分的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中 TreeSet类用法
/* TreeSet的性能比 HashSet差但是我们  在需要排序的时候可以用TreeSet  因为他是 自然排序也就是 升序 下面是TreeSet实现代码  这个类也似只能通过迭代器迭代元素 */ import java.
695 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
【微信Java开发 --1---番外1】在windows下,使用JAVA执行多条DOS命令+文件夹/路径中有空格怎么解决【目的是实现内容穿透外网】
内网穿透外网的那一篇,参正集1 但是每次都要Ctrl+R 启动DOS窗口,也就是CMD,一句一句的去粘,略显繁琐。 所以将这些任务写在JAVA程序中,启动一次程序就可以实现【内网穿透】的功能,多好啊!   首先把流程走一遍 1.
1063 0
+关注
316
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载