TreeSet是基于红黑树的有序集合,自动排序且去重,支持自然排序和自定义Comparator,适用于需有序唯一数据的场景。

在Java中,TreeSet 是一个基于红黑树(Red-Black Tree)实现的有序集合类,属于 java.util 包。它实现了 SortedSet 接口,能够自动对元素进行排序,并保证集合中的元素不重复。与 HashSet 不同,TreeSet 不仅去重,还天然有序。
TreeSet的基本使用方法
创建一个 TreeSet 实例非常简单,可以直接通过无参构造函数初始化:
TreeSet set = new TreeSet();set.add(5);set.add(1);set.add(3);System.out.println(set); // 输出:[1, 3, 5]
可以看到,即使插入顺序是 5、1、3,输出时已经按升序排列。这是因为 TreeSet 默认按照元素的自然排序(natural ordering)进行组织。
支持自然排序的数据类型包括:Integer、Double、String 等实现了 Comparable 接口的类。
立即学习“Java免费学习笔记(深入)”;
自定义排序规则
如果想改变排序方式,比如降序排列,可以通过传入 Comparator 来实现:
Qoder
阿里巴巴推出的AI编程工具
270 查看详情
TreeSet descendingSet = new TreeSet((a, b) -> b.compareTo(a));descendingSet.add(5);descendingSet.add(1);descendingSet.add(3);System.out.println(descendingSet); // 输出:[5, 3, 1]
这里使用了 Lambda 表达式定义比较器,使元素按降序排列。你也可以为自定义对象提供比较逻辑。
例如有一个 Person 类,按年龄排序:
class Person { String name; int age; // 构造函数 public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + "(" + age + ")"; }}// 使用 TreeSet 按年龄排序TreeSet people = new TreeSet((p1, p2) -> Integer.compare(p1.age, p2.age));people.add(new Person("Alice", 30));people.add(new Person("Bob", 25));people.add(new Person("Charlie", 35));System.out.println(people); // 输出:[Bob(25), Alice(30), Charlie(35)]
常用操作技巧与注意事项
TreeSet 提供了许多高效的操作方法,适用于需要频繁查找、去重和有序遍历的场景。
add(E e):添加元素,自动排序并去重,时间复杂度 O(log n) remove(Object o):删除指定元素,O(log n) contains(Object o):判断是否包含某元素,O(log n) first() 和 last():获取最小和最大元素 higher(E e):返回大于给定元素的最小元素 lower(E e):返回小于给定元素的最大元素 headSet(E to)、tailSet(E from)、subSet(E from, E to):获取子集视图
示例:使用 headSet 获取小于某个值的所有元素:
TreeSet numbers = new TreeSet(Arrays.asList(1, 3, 5, 7, 9));SortedSet lessThan7 = numbers.headSet(7);System.out.println(lessThan7); // 输出:[1, 3, 5]
注意点:
添加的元素必须实现 Comparable 接口,或在构造时提供 Comparator,否则会抛出 ClassCastException 不能插入 null 元素(除非集合为空且使用了允许 null 的 Comparator),否则会抛出 NullPointerException TreeSet 非线程安全,多线程环境下需手动同步基本上就这些。TreeSet 在需要有序且唯一数据结构时非常实用,掌握它的排序机制和常用API能有效提升代码质量。
以上就是在Java中如何使用TreeSet实现有序集合_TreeSet集合操作技巧的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1045700.html
微信扫一扫
支付宝扫一扫