TreeSet集合的add()方法源码解析(01.Integer自然排序)-阿里云开发者社区

开发者社区> effort880829> 正文

TreeSet集合的add()方法源码解析(01.Integer自然排序)

简介: 》TreeSet集合使用实例 》TreeSet集合的红黑树 存储与取出(图) 》TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itcast_05; import java.util.TreeSet; /* * TreeSet:能够对元素按照某种规则进行排序。
+关注继续查看

》TreeSet集合使用实例

》TreeSet集合的红黑树 存储与取出(图)

》TreeSet的add()方法源码

 

 

  • TreeSet集合使用实例

package cn.itcast_05;

import java.util.TreeSet;

/*
 * TreeSet:能够对元素按照某种规则进行排序。
 * 排序有两种方式
 * A:自然排序
 * B:比较器排序
 * 
 * TreeSet集合的特点:排序和唯一
 * 
 * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        // 创建集合对象
        // 自然顺序进行排序
        TreeSet<Integer> ts = new TreeSet<Integer>();

        // 创建元素并添加
        // 20,18,23,22,17,24,19,18,24
        ts.add(20);
        ts.add(18);
        ts.add(23);
        ts.add(22);
        ts.add(17);
        ts.add(24);
        ts.add(19);
        ts.add(18);
        ts.add(24);

        // 遍历
        for (Integer i : ts) {
            System.out.println(i);
        }
    }
}

 

 

  • TreeSet集合的红黑树 存储与取出(图)

img_19e1dccd1b30165a4ebdb02b72fcc3b2.jpg

 

 

  • TreeSet的add()方法源码

interface Collection{...}

 

interface Set extends Collection{...}

 

interface NavigableMap{...}

 

class TreeMap implements NavigableMap{
 private final Comparator<? super K> comparator;
 
     public V put(K key, V value) {
        Entry<K,V> t = root;//根元素
        if (t == null) {//起初,建立根元素
        // TBD:
        // 5045147: (coll) Adding null to an empty TreeSet should
        // throw NullPointerException
        //
        // compare(key, key); // type check
            root = new Entry<K,V>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;//通过比较器创建的TreeMap?
        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;//自然排序,Integer implements Comparable接口,并重写了compareTo()方法
            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<K,V>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }


}

 

class TreeSet implements Set{
    
    private transient NavigableMap<E,Object> m;
 
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    } 
 
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
     
    public boolean add(E e) {
           return m.put(e, PRESENT)==null;
    }
}
开始做,坚持做,重复做

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
服务(Service)全解析(三)--IntentService
MainActivity如下: package cc.testservice3; import android.os.Bundle; import android.
628 0
C语言及程序设计进阶例程-25 排序问题及其求解
贺老师教学链接 C语言及程序设计进阶 本课讲解 快速排序实现 #include&lt;stdio.h&gt; void quicksort(int data[],int first,int last) { int i, j, t, base; if (first&gt;last) return; base=data[first];
999 0
有赞实时任务优化:Flink Checkpoint 异常解析与应用实践
本文结合 Flink 1.9 版本,重点讲述 Flink Checkpoint 原理流程以及常见原因分析,让用户能够更好的理解 Flink Checkpoint,从而开发出更健壮的实时任务。
1274 0
Paint类解析
在自定义组件中,Paint类是一个很重要的类,主要包含颜色、文本、图形样式、位图模式、滤镜等几个方面。Paint类的相关方法如下: 1、颜色是指绘图时使用的颜色,在 Android 中颜色可以指定透明度,使用 16...
737 0
浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)
pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/   我们先把资源下载下来,连同源码和jar包一起放入工程。如下图:   接下来在demo包下,我们写一个测试类,简单使用pinyin4j对中文字符进行自然排序 新建一个ConvertTest.
1066 0
2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2668    Accepted Submission(s...
1038 0
利用Clion对几种排序算法进行时间复杂度与空间复杂度的分析
算法 利用算法解决问题的步骤: 1、将问题模型化 2、找到一个合适的算法 3、这个算法足够快吗?对空间友好吗 4、如果不是,找出为什么 5、找到一个方法解决这个问题 6、一直迭代直到这个问题被解决 ...
976 0
+关注
243
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载