首页 > 编程语言 >java中的TreeSet的add()方法解析

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

时间:2023-01-03 15:46:19浏览次数:46  
标签:java value add key new null TreeSet

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 }

 

标签:java,value,add,key,new,null,TreeSet
From: https://www.cnblogs.com/zwgitOne123/p/17022420.html

相关文章

  • 33_Java中的位运算
    Java中的位运算符一、位运算概述位运算就是直接对整数在内存中的二进制位进行操作分类:​ 逻辑位运算符:位与(&)、位或(|)、位异(^)、位取反(~)​ 移位运算:左移(<<......
  • java 反射工具类ReflectUtils
    /***反射工具类.提供调用getter/setter方法,访问私有变量,调用私有方法,获取泛型类型Class,被AOP过的真实类等工具函数.**@authorruoyi*/@SuppressWarni......
  • 第一章:Java开发环境搭建
    感谢动力节点(放弃幻想,认清现实)1.知识框架2.计算机编程语言发展史?第一代语言:机器语言程序员直接编写二进制,一串二进制代码,例如:10010100010010001000..........
  • java8中常用函数式接口Supplier<T>、Consumer<T>、Function<T,R>、Predicate<T>使用示
    场景函数式接口(FunctionalInterface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用......
  • 简单记一下Java环境搭建(jdk安装和环境搭建、jre安装和环境搭建,IDEA的安装)
      今天是我来单位学习的第一天,基本啥也不知道,这里给我分配的电脑刚重装完系统,本来也是啥也不会,所以就先在这台电脑上搭建一下Java环境,方便以后要是有人用这台电脑可以直......
  • Java里if和else的用法
    前言在上一篇文章中,壹哥给大家讲解了Java里的输入与输出语句,现在你知道怎么用了吗?接下来我们继续往下学习Java里的流程控制语句,今天先给大家讲一下if和else这一对好基友,......
  • java.lang.Exception: No runnable methods
    java.lang.Exception:Norunnablemethods 1、问题现象1)测试代码packagecom.example.disruptordemo;importcom.example.disruptordemo.service.DisruptorMqSer......
  • Java爬取中国天气网实况天气数据
    因实验室需求,需要找一个实况天气API。百度云、阿里云、腾讯云上边我都去找了,很多平台要么没有,要么要收费(免费的可调用次数太少了)。而我在高德开放平台上找到了一个,但是不......
  • nginx-clojure java 集成试用
    主要是基于java开发一个简单的扩展,学习下流程java项目pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4......
  • JavaScript 深拷贝
    在进行赋值之前,为指针类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。这种拷贝称为深拷贝。————百度百科源码⚠还有部分类型不支持typescript:/......