TreeSet

TreeSet

TreeSet 集合继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
TreeSet基于TreeMap实现的。TreeSet中含有一个”NavigableMap类型的成员变量”m,而m实际上是”TreeMap的实例”。
底层的数据结构是红黑树(平衡二叉树)

能够对元素按照某种规则进行排序。同时也保证元素的唯一。 两种排序方式:
自然排序
比较器排序
使用元素的自然排序对元素进行排序,还是根据创建集合时提供的Comparator比较器进行排序,这取决于使用的 构造方法

TreeSet集合特点:排序唯一

TreeSet存储Integer类型的元素并遍历

背景:自然排序
要知道Integer类本身已实现了Comparable接口,重写了compare()方法。

import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args){
        TreeSet<Integer> ts= new TreeSet<Integer>();//这里是自然排序

        ts.add(10);//会自动装箱
        ts.add(12);
        ts.add(88);
        ts.add(32);
        ts.add(10);
        ts.add(8);
        ts.add(100);
        ts.add(10);

        for(Integer number: ts){
            System.out.println(number); //输出结果: 8 10 12 32 88 100
        }

    }

TreeSet ts= new TreeSet();//看构造方法,示例中采取的是自然排序。

真正比较的是依赖元素的compareTo()方法,而这个方法是定义在Comparable里面的。所以,你要想重写此方法。就必须是先实现Comparable接口。本例中Integer类本身已实现了Comparable接口,重写了compare()方法。
Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,这个排序称为自然排序
Comparable接口的方法:int compareTo(T o) 将此对象与指定的对象进行比较以进行排序。 参数 o - 要比较的对象。结果
负整数,零或正整数,因为该对象小于,等于或大于指定对象。

此时,元素是如何存储进去的?

要知道,TreeSet集合底层数据结构是红黑树(平衡二叉树)。
第一个元素存储的时候,直接作为根节点。
从第二个开始,每个元素从根节点开始比较:
大——就作为右孩子
小——就作为左孩子
相等——不搭理它

TreeSet存储自定义类型的元素并遍历

需要自定义类型(如Student类)去实现Comparable接口,重写compareTo()方法。
根据需求(如,要自然排序,按照学生的年龄从小到大排序),去重写compareTo()方法。

class Student implements Comparable<T>{
    //重写compareTo()方法
    ....
}

两种排序

自然排序:让元素所属的类中实现自然排序接口Comparerable接口 。可以在自定义类中实现Comparerable接口,重写compareTo()方法。
比较器排序:让集合的构造方法接收一个比较器Comparator接口的子类对象。可以在自定义类中实现Comparetor接口,重写compare()方法。

TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
如:TreeSet<Integer> ts= new TreeSet<Integer>();//这里表明是自然排序
TreeSet如果传入Comparator, 就优先按照Comparator
如:TreeSet<Integer> ts= new TreeSet<Integer>(new MyComparator());//这里是比较器排序。在创建集合时让集合的构造方法接收一个比较器接口的子类对象MyComparator
单独创建一个MyComparator类不是特别好,可以将MyComparetor的内容直接写到主类中。开发中常用匿名内部类实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值