集合Tree

Tree

TreeSet

  • TreeSet的底层就是TreeMap
  • TreeSet练习
  • TreeSet可以进行排序
package com.lyc._Tree;

import java.util.Comparator;
import java.util.TreeSet;

public class treeSet01 {
    public static void main(String[] args) {

        //笔记
        //1.当我们使用无参构造器来创建treeSet时,仍然是无序的
        //2.我们希望添加的元素,按照字符串大小来排序时
        //3.使用treeSet提供的一个构造器,可以传入一个比较器,(匿名内部类)
        //并指定排序规则
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //将o1 o2转型为 String类型,这样就可以调用String的compareTo方法,让两个字符串进行比较
                //return ((String)o2).compareTo((String) o1);
                //如果我们想要按照字符串的长度从小到大排列
                return ((String)o2).length() -((String)o1).length();
            }
        });

        treeSet.add("a");
        treeSet.add("bb");
        treeSet.add("ccc");
        treeSet.add("dddd");
        //如果我门在比较字符串长度的情况下,在添加一个长度为3的字符串,这时是加不进去的,因为构造方法中的比较规则就是长度比较,此时已有长度为3的字符串
        //再继续添加同长度的子符串,就会返回空,就不会添加
        //如果再把比较规换成,比较字符,就可以正常添加,因为treeSet中并没有与abc相同的字符串
        treeSet.add("abc");

        System.out.println(treeSet);

    }
}


  • 源码解读

1.构造器把传入的比较对象,赋给了treeSet底层的TreeMap的属性this.comparator

 public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }

2.在调用 treeSet.add()方法时,在底层会执行下面代码

Comparator<? super K> cpr = comparator;
if (cpr != null) {//这就是我们的匿名内部类对象
    do {
        parent = t;
        cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象),compare
        if (cmp < 0)
            t = t.left;
        else if (cmp > 0)
            t = t.right;
        else//如果相等,即返回0,这个key就没有加入
            return t.setValue(value);
    } while (t != null);
}

TreeMap

在这里插入图片描述

注意:key可以为null,但是前提是自定义了Comparator,然后里面处理了空指针引用的异常!!!不是TreeMap不支持null,而是String的compareTo不支持,实现一个支持null的比较器就可以了!!

//比较方式的源码
Comparator<? super K> cpr = comparator;
if (cpr != null) {//这就是我们的匿名内部类对象
    do {
        parent = t;
        cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象),compare,
        //此时我们对比对象不再使用equals方法,而是我们的compare方法来决定的
        if (cmp < 0)
            t = t.left;
        else if (cmp > 0)
            t = t.right;
        else//如果相等,即返回0,这个key就没有加入,当compare方法对比长度时,相同长度就会被认为是相同的对象,就不会加入
            return t.setValue(value);
    } while (t != null);
}
package com.lyc._Tree;

import sun.reflect.generics.tree.Tree;

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMap_ {

    public static void main(String[] args) {
        //使用默认构造器创建,默认认为排序规则为,key的首字母排序,因为String实现了Comparator
        //TreeMap treeMap = new TreeMap();


        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //若果我们想要降序排序了
                 return ((String)o2).compareTo((String)o1);

                //若是想按照key 的长度进行排序,注意如果按照长度排序的话,出现相同长度时,后加入的会加入失败
                //return ((String)o1).length() - ((String)o2).length();
            }
        });

        treeMap.put("cde","水浒");
        treeMap.put("a","红楼");
        treeMap.put("e","西游");
        treeMap.put("bc","三国");
        treeMap.put("cdef","聊斋");

        treeMap.put("a","黄梅戏");//注意treeMap中当出现相同key值时,value会被替换

        System.out.println(treeMap);

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值