java集合(十七) ---- TreeSet 类

发布于:2025-06-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

十七、TreeSet 类

17.1 位置

17.2 特点

17.3 二叉树

17.4 详解 TreeSet 类的存储过程

17.5 构造方法

17.6 常用方法

17.7 注意

17.6 代码举例一

17.7 代码举例二


十七、TreeSet 类

17.1 位置

TreeSet 类位于 java.util 包中

17.2 特点

  1. 底层采用 TreeMap 类来存储数据
  2. 底层采用二叉树的结构
  3. TreeSet 类中的元素是不重复的且有序的
  4. TreeSet 类中的元素遍历时采用中序遍历。所以对于 TreeSet 类来说,不管放入元素的顺序是什么样,读取出来的数据都是以升序排列

17.3 二叉树

  1. 二叉树:每个节点最多有两个子节点的有序树
  2. 子树:一个节点及其子节点组成的树
  3. 左子树:二叉树中左侧的子树。左子树上的元素都小于它的根节点
  4. 右子树:二叉树中右侧的子树。右子树上的元素都大于它的根节点
  5. 说明:在二叉树中,对于同一层的元素,左边的元素总是小于右边的元素

17.4 详解 TreeSet 类的存储过程

当二叉树中存入新元素时,新元素首先会与最顶层元素进行比较。如果小于最顶层元素,则新元素往左边走。如果大于最顶层元素,则新元素往右边走。一直这样比较下去,直到与最后一个元素进行比较。如果新元素小于最后一个元素,就将新元素放在最后一个元素的左边。如果大于最后一个元素,就将新元素放在最后一个元素的右边

举例:依次存入 13、8、19、19、0、11、35、50

中序遍历为先遍历左子树,再遍历根节点,最后再遍历右子树。即左根右。

遍历的结果为:0、8、11、13、19、35、50

17.5 构造方法

public TreeSet()

作用

创建一个空的 TreeSet 对象

public TreeSet(Comparator<? super E> comparator)

作用

创建一个具有指定比较器的空的 TreeSet 对象

注意:传入的是实现 Comparator 接口的类的对象

public TreeSet(Collection<? extends E> c)

作用

创建一个包含指定集合 c 的 TreeSet 对象

17.6 常用方法

public E first()

方法名

first()

作用

返回集合中遍历后的第一个元素

public E last()

方法名

last()

作用

返回集合中遍历后的最后一个元素

public E pollFirst()

方法名

pollFirst()

作用

移除集合中遍历后的第一个元素

public E pollLast()

方法名

pollLast()

作用

移除集合中遍历后的最后一个元素

public E lower(E e)

方法名

lower()

作用

返回集合中小于给定元素的最大元素。如果没有则返回 null

public E floor(E e)

方法名

floor()

作用

返回集合中小于或等于给定元素的最大元素。如果没有则返回 null

public E higher(E e)

方法名

higher()

作用

返回集合中大于给定元素的最小元素。如果没有则返回 null

public E ceiling(E e)

方法名

ceiling()

作用

返回集合中大于或等于给定元素的最小元素。如果没有则返回 null

说明

其他常用方法参考 Collection 接口

17.7 注意

  1. TreeSet 类存储自定义类时,需要自定义类实现了 Comparable 接口。若没实现 Comparable 接口,则 TreeSet 类也要有自己的比较器 Comparator。若都没有,则会出现错误
  2. TreeSet 类只能存储同种数据类型。不同种数据类型不能放在 TreeSet 类中

17.6 代码举例一

import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add(13);
        treeSet.add(8);
        treeSet.add(19);
        treeSet.add(19);
        treeSet.add(0);
        treeSet.add(11);
        treeSet.add(35);
        treeSet.add(50);

        System.out.print("遍历结果为:");
        for (Object object : treeSet) {
            System.out.print(object);
            System.out.print(" ");
        }

        System.out.println();
        System.out.println("第一个元素为:" + treeSet.first());
        System.out.println("最后一个元素为:" + treeSet.last());
    }
}

17.7 代码举例二

import java.util.*;

class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public int getAge() {
        return age;
    }
}

public class Test02 {
    public static void main(String[] args) {
        //Comparator 比较器
        Comparator<Student> comparator = new Comparator<Student>() {
            @Override
            public int compare(Student obj1, Student obj2) {
                return obj2.getAge() - obj1.getAge();
            }
        };

        //TreeSet 类中传入比较器
        TreeSet treeSet = new TreeSet(comparator);

        treeSet.add(new Student("li",999));
        treeSet.add(new Student("li",999));
        treeSet.add(new Student("zhang",12));
        treeSet.add(new Student("wang",24));
        treeSet.add(new Student("wen",10));

        System.out.println("遍历结果为:");
        for (Object object : treeSet) {
            System.out.println(object);
        }
    }
}



网站公告

今日签到

点亮在社区的每一天
去签到