TreeSet

本文介绍了TreeSet集合,它继承于AbstractSet,基于TreeMap实现,底层是红黑树。具有排序和唯一的特点。阐述了其存储Integer类型和自定义类型元素的方式,以及元素存储规则。还介绍了自然排序和比较器排序两种排序方式,开发中常用匿名内部类实现比较器排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的内容直接写到主类中。开发中常用匿名内部类实现。

04-09
### Java TreeSet 的使用方法及示例 #### 什么是 TreeSet? `TreeSet` 是 Java 集合框架中的一个重要实现类,它继承自 `AbstractSet` 并实现了 `NavigableSet` 接口。`TreeSet` 底层基于红黑树结构实现,因此它可以自动对存储的元素进行排序。 以下是关于 `TreeSet` 常见操作的具体说明及其代码示例: --- #### 创建并初始化 TreeSet 可以通过无参构造函数创建一个默认的 `TreeSet` 实例,或者通过指定比较器来定义排序方式[^4]。 ```java import java.util.TreeSet; public class Main { public static void main(String[] args) { // 默认按照自然顺序排列 TreeSet<Integer> treeSet = new TreeSet<>(); // 添加元素到 TreeSettreeSet.add(10); treeSet.add(5); treeSet.add(20); System.out.println("TreeSet elements: " + treeSet); // 输出 {5, 10, 20} } } ``` 上述代码展示了如何向 `TreeSet` 插入数据,并按升序排列[^2]。 --- #### 获取子集(subSet) 可以利用 `subSet()` 方法获取某个范围内的子集合。此方法接受两个参数:起始值和结束值(不包含结束值)。如果不存在满足条件的元素,则返回空集合[^1]。 ```java import java.util.TreeSet; public class SubSetExample { public static void main(String[] args) { TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(1); treeSet.add(5); treeSet.add(10); treeSet.add(15); treeSet.add(20); // 获取介于 5 和 15 之间的元素(不含边界) System.out.println(treeSet.subSet(5, 15)); // 输出 [10] } } ``` --- #### 查找第一个元素(first()) 调用 `first()` 可以获得当前集合中最小的一个元素。如果没有元素存在则抛出异常[^3]。 ```java import java.util.TreeSet; public class FirstElementExample { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(); treeSet.add("Apple"); treeSet.add("Banana"); treeSet.add("Cherry"); String firstElement = treeSet.first(); System.out.println("First element is: " + firstElement); // 输出 Apple } } ``` --- #### 自定义 Comparator 进行排序 当希望改变默认的自然排序逻辑时,可传入自定义的 `Comparator` 对象给 `TreeSet` 构造器。 ```java import java.util.Comparator; import java.util.TreeSet; public class CustomComparatorExample { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String s1, String s2) { return Integer.compare(s2.length(), s1.length()); // 按字符串长度降序排列 } }); treeSet.add("Short"); treeSet.add("LongerString"); treeSet.add("MediumLength"); System.out.println("Sorted by length descending: " + treeSet); // 输出 [LongerString, MediumLength, Short] } } ``` --- #### 总结 以上介绍了 `TreeSet` 的基本功能以及一些常用的方法,包括但不限于添加元素、查找特定位置的数据项、提取部分区间的内容等。这些特性使得 `TreeSet` 成为了处理有序且唯一数据的理想容器之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值