目录
十七、TreeSet 类
17.1 位置
TreeSet 类位于 java.util
包中
17.2 特点
- 底层采用 TreeMap 类来存储数据
- 底层采用二叉树的结构
- TreeSet 类中的元素是不重复的且有序的
- TreeSet 类中的元素遍历时采用中序遍历。所以对于 TreeSet 类来说,不管放入元素的顺序是什么样,读取出来的数据都是以升序排列
17.3 二叉树
- 二叉树:每个节点最多有两个子节点的有序树
- 子树:一个节点及其子节点组成的树
- 左子树:二叉树中左侧的子树。左子树上的元素都小于它的根节点
- 右子树:二叉树中右侧的子树。右子树上的元素都大于它的根节点
- 说明:在二叉树中,对于同一层的元素,左边的元素总是小于右边的元素
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 注意
- TreeSet 类存储自定义类时,需要自定义类实现了 Comparable 接口。若没实现 Comparable 接口,则 TreeSet 类也要有自己的比较器 Comparator。若都没有,则会出现错误
- 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);
}
}
}