• 一起学习集合框架之 TreeSet


    什么是 TreeSet

    TreeSet 是一个具有唯一元素的二叉树的集合,又被翻译为 树集。Java 中的 TreeSet 类是 Java 集合框架的一部分,从 Java 6 开始,它实现了 NavigableSet 接口(这个接口增加了几个查找元素以及反向遍历的便利方法),从而扩展了 SortedSet 集合。

    TreeSet 类与散列类十分相似,不过,它比普通的集合有所改进,树集是一个有序集合(sorted collection),该数据结构的元素按自然顺序排序。

    • SortedSet 接口提供了保持元素排序的功能。
    • Navigableset 接口提供了可以通过 SortedSet 检索的功能。例如,找到该元素大于或小于给定元素,找到排序集中的第一个和最后一个元素。

    接口 API

    我们来看看 TreeSet 的接口:

    TreeSet()

    1. public TreeSet() {
    2. this(new TreeMap<>());
    3. }

    TreeSet(Comparator comparator)

    1. public TreeSet(Comparatorsuper E> comparator) {
    2. this(new TreeMap<>(comparator));
    3. }

    TreeSet(Collection c)

    1. public TreeSet(Collection c) {
    2. this();
    3. addAll(c);
    4. }

    TreeSet(SortedSet s)

    1. public TreeSet(SortedSet s) {
    2. this(s.comparator());
    3. addAll(s);
    4. }

    其他方法

    其他方法,可以读者自行研究,如下:

    因为实现了 SortedSet 接口,因此具有:

    • Comparator comparator() 、
    • E first()
    • E last()

    又实现了 NavigableSet 接口:

    • E higher(E value) 和 E lower(E value) :返回大于 value 的最小元素和小于 value 的最大元素,如果没有则返回 null
    • E celling(E value)和 E floor(E value) :返回大于等于 value 的最小元素或小于等于 value 的最大元素,如果没有 则返回 null
    • E pollFirst() 和 E pullLast():删除并返回这个集合中的最大元素或最小元素,这个集合为空时返回 null
    • Iterator descendingIterator():返回一个按照递减顺序遍历集合中元素的迭代器

    简单的 TreeSet 例子

    我们可以以任意顺序将元素插入到集合中,在对集合进行遍历时,会返回排序好的值。例如:

    1. import java.util.TreeSet;
    2. public class TreeSetExample {
    3. public static void main(String[] args) {
    4. // 定义一个 String 类型的树集
    5. TreeSet<String> treeset = new TreeSet<String>();
    6. // 添加元素
    7. treeset.add("Learning TreeSet");
    8. treeset.add("Hello, world!");
    9. treeset.add("ABC");
    10. treeset.add("Yuzhou1su");
    11. treeset.add("宇宙之一粟");
    12. for (String ts : treeset) {
    13. System.out.println(ts);
    14. }
    15. }
    16. }

    运行结果:

    1. ABC
    2. Hello, world!
    3. Learning TreeSet
    4. Yuzhou1su

    正如 TreeSet 类名一般,排序是通过树数据结构完成的(实现的是红黑树),如果要使用树集,必须能够比较元素,即这些元素必须实现 Comparable 接口,或者构造集必须提供一个 Comparator。

    自定义比较器的 TreeSet

    树集中默认是升序,让我们来自定义一个降序的比较器:

    1. package com.yuzhou1su.TreeSetExample;
    2. import java.util.TreeSet;
    3. import java.util.Comparator;
    4. import java.util.SortedSet;
    5. public class TreeSetDescendingOrderExample {
    6. public static void main(String[] args) {
    7. SortedSet<Integer> nums = new TreeSet<>(Comparator.reverseOrder());
    8. nums.add(1);
    9. nums.add(99);
    10. nums.add(20);
    11. nums.add(2022);
    12. nums.add(2035);
    13. System.out.println("Descending order:" + nums);
    14. }
    15. }

    运算结果:

    1. Descending order:[2035, 2022, 99, 20, 1]

    下面来看一下 TreeSet 如何创建、往其中插入元素、如何搜索和字符串化操作。如何集合为空,则 TreeSet 只允许一个空值。TreeSet 的添加、删除和查找包含的函数的算法复杂度为 log(n)

    插入节点

    1. func (treeset *TreeSet) InsertTreeNode(treeNodes ...TreeNode) {
    2. }
  • 相关阅读:
    OpenWrt之opkg详解
    Go语言的设计哲学
    python_argparse模块的使用
    kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏
    对于毕业以后感到迷茫吗,不知道毕业以后该做什么吗?
    计算机网络——计算机网络体系结构
    【NeurIPS 2023】Backdoor对抗攻防论文汇总
    IPv6知识点整理
    队列题目:设计循环双端队列
    SLAM中常用的雅克比矩阵J
  • 原文地址:https://blog.csdn.net/LBWNB_Java/article/details/126398810