掌握 Java TreeSet:操作、方法与实战示例全解析
Java TreeSet
TreeSet 类提供树数据结构功能,实现了 NavigableSet 接口。
创建 TreeSet
先导入 java.util.TreeSet,再创建实例:
TreeSet<Integer> numbers = new TreeSet<>();
无参构造按自然顺序(升序)排序。也可通过 Comparator 自定义排序规则。
TreeSet 方法
插入元素
add()– 插入指定元素addAll()– 插入指定集合的所有元素
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
evenNumbers.add(6);
System.out.println("TreeSet: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.addAll(evenNumbers);
System.out.println("New TreeSet: " + numbers);
}
}
输出
TreeSet: [2, 4, 6] New TreeSet: [1, 2, 4, 6]
访问元素
可使用 iterator() 方法遍历,需导入 java.util.Iterator:
import java.util.TreeSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
Iterator<Integer> iterate = numbers.iterator();
System.out.print("TreeSet using Iterator: ");
while(iterate.hasNext()) {
System.out.print(iterate.next() + ", ");
}
}
}
输出
TreeSet: [2, 5, 6] TreeSet using Iterator: 2, 5, 6,
移除元素
remove()– 移除指定元素removeAll()– 移除所有元素
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
输出
TreeSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
导航方法
TreeSet 实现 NavigableSet,提供丰富导航方法。
1. first() 和 last() 方法
first()– 返回首元素last()– 返回尾元素
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
int first = numbers.first();
System.out.println("First Number: " + first);
int last = numbers.last();
System.out.println("Last Number: " + last);
}
}
输出
TreeSet: [2, 5, 6] First Number: 2 Last Number: 6
2. ceiling()、floor()、higher() 和 lower() 方法
- higher(element) – 返回严格大于指定元素的最小元素
- lower(element) – 返回严格小于指定元素的最大元素
- ceiling(element) – 返回大于或等于指定元素的最小元素;若元素存在则返回该元素
- floor(element) – 返回小于或等于指定元素的最大元素;若元素存在则返回该元素
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("Using higher: " + numbers.higher(4));
System.out.println("Using lower: " + numbers.lower(4));
System.out.println("Using ceiling: " + numbers.ceiling(4));
System.out.println("Using floor: " + numbers.floor(3));
}
}
输出
TreeSet: [2, 4, 5, 6] Using higher: 5 Using lower: 2 Using ceiling: 4 Using floor: 2
3. pollFirst() 和 pollLast() 方法
pollFirst()– 获取并移除首元素pollLast()– 获取并移除尾元素
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("Removed First Element: " + numbers.pollFirst());
System.out.println("Removed Last Element: " + numbers.pollLast());
System.out.println("New TreeSet: " + numbers);
}
}
输出
TreeSet: [2, 4, 5, 6] Removed First Element: 2 Removed Last Element: 6 New TreeSet: [4, 5]
4. headSet()、tailSet() 和 subSet() 方法
headSet(element, booleanValue)
返回指定元素之前的所有元素。booleanValue 可选,默认 false。为 true 时包含指定元素。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("Using headSet without boolean value: " + numbers.headSet(5));
System.out.println("Using headSet with boolean value: " + numbers.headSet(5, true));
}
}
输出
TreeSet: [2, 4, 5, 6] Using headSet without boolean value: [2, 4] Using headSet with boolean value: [2, 4, 5]
tailSet(element, booleanValue)
返回指定元素之后的所有元素(含该元素)。booleanValue 可选,默认 true。为 false 时不包含指定元素。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("Using tailSet without boolean value: " + numbers.tailSet(4));
System.out.println("Using tailSet with boolean value: " + numbers.tailSet(4, false));
}
}
输出
TreeSet: [2, 4, 5, 6] Using tailSet without boolean value: [4, 5, 6] Using tailSet with boolean value: [5, 6]
subSet(e1, bv1, e2, bv2)
返回 e1 与 e2 之间的元素(含 e1)。bv1 默认 true,bv2 默认 false。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("Using subSet without boolean value: " + numbers.subSet(4, 6));
System.out.println("Using subSet with boolean value: " + numbers.subSet(4, false, 6, true));
}
}
输出
TreeSet: [2, 4, 5, 6] Using subSet without boolean value: [4, 5] Using subSet with boolean value: [5, 6]
集合运算
TreeSet 方法可用于各种集合运算。
并集
使用 addAll() 实现并集:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
输出
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Union is: [1, 2, 3, 4]
交集
使用 retainAll() 实现交集:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
numbers.retainAll(evenNumbers);
System.out.println("Intersection is: " + numbers);
}
}
输出
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Intersection is: [2]
差集
使用 removeAll() 计算差集:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet2: " + numbers);
numbers.removeAll(evenNumbers);
System.out.println("Difference is: " + numbers);
}
}
输出
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] Difference is: [1, 3]
子集判断
使用 containsAll() 判断是否为子集:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet1: " + numbers);
TreeSet<Integer> primeNumbers = new TreeSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("TreeSet2: " + primeNumbers);
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is TreeSet2 subset of TreeSet1? " + result);
}
}
输出
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] Is TreeSet2 subset of TreeSet1? True
TreeSet 其他方法
| 方法 | 描述 |
|---|---|
clone() | 创建 TreeSet 副本 |
contains() | 搜索指定元素并返回布尔结果 |
isEmpty() | 检查 TreeSet 是否为空 |
size() | 返回 TreeSet 大小 |
clear() | 移除所有元素 |
详见官方文档:Java TreeSet。
TreeSet 与 HashSet 对比
TreeSet元素有序(实现SortedSet),HashSet无序TreeSet提供导航方法(first()、last()、headSet()等),因实现NavigableSetHashSet在添加、移除、包含、大小等基本操作上比TreeSet更快
TreeSet Comparator 自定义排序
默认自然排序,可通过 Comparator 自定义:
import java.util.TreeSet;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
TreeSet<String> animals = new TreeSet<>(new CustomComparator());
animals.add("Dog");
animals.add("Zebra");
animals.add("Cat");
animals.add("Horse");
System.out.println("TreeSet: " + animals);
}
public static class CustomComparator implements Comparator<String> {
@Override
public int compare(String animal1, String animal2) {
int value = animal1.compareTo(animal2);
if (value > 0) return -1;
else if (value < 0) return 1;
else return 0;
}
}
}
输出
TreeSet: [Zebra, Horse, Dog, Cat]
传入 CustomComparator 实现逆序排序。详见 Java Comparator 官方文档。
java
- MATLAB 数值类型详解:存储、转换与范围查询
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 掌握 Java 集合算法:排序、打乱、搜索与更多实用操作
- Java 生成随机数实战:Random 与 Math.random 详解