Dart SplayTreeSet
最后修改于 2025 年 4 月 4 日
在 Dart 中,SplayTreeSet 是 Set 的一种自平衡二叉搜索树实现。它以排序顺序维护元素,并提供高效的操作。
SplayTreeSet 实现 Set 接口并自动对元素进行排序。它使用 splay 树操作,为大多数操作提供摊销 O(log n) 的性能。
创建 SplayTreeSet
创建 SplayTreeSet 最简单的方法是使用构造函数。
main.dart
import 'dart:collection';
void main() {
var numbers = SplayTreeSet<int>();
numbers.addAll([5, 3, 7, 1, 9]);
print(numbers);
}
我们创建一个 SplayTreeSet 整数集合。addAll 方法一次添加多个元素。集合会自动以排序顺序维护元素。
$ dart main.dart
{1, 3, 5, 7, 9}
使用 Comparator 进行自定义排序
我们可以提供自定义比较器来定义我们自己的排序顺序。
main.dart
import 'dart:collection';
void main() {
var names = SplayTreeSet<String>((a, b) => b.compareTo(a));
names.addAll(['Alice', 'Bob', 'Charlie', 'David']);
print(names);
}
这会创建一个按字母反向排序的 SplayTreeSet。比较器函数定义了集合中元素的排序方式。
$ dart main.dart
{David, Charlie, Bob, Alice}
第一个和最后一个元素
SplayTreeSet 提供对第一个和最后一个元素的有效访问。
main.dart
import 'dart:collection';
void main() {
var prices = SplayTreeSet<double>();
prices.addAll([19.99, 9.99, 29.99, 14.99]);
print('First: ${prices.first}');
print('Last: ${prices.last}');
print('Elements >= 15: ${prices.from(15.0)}');
}
我们访问集合中的最小和最大元素。from 方法返回大于或等于给定值的元素的视图。
$ dart main.dart
First: 9.99
Last: 29.99
Elements >= 15: {19.99, 29.99}
范围操作
SplayTreeSet 支持使用 from、to 和 between 进行高效的范围查询。
main.dart
import 'dart:collection';
void main() {
var years = SplayTreeSet<int>();
years.addAll([2000, 2010, 2020, 2030, 2040]);
print('Years after 2020: ${years.from(2021)}');
print('Years up to 2030: ${years.to(2030)}');
print('Years 2010-2030: ${years.range(2010, 2030)}');
}
这些操作返回原始集合的视图。它们很高效,因为它们利用了树结构,而无需创建新集合。
$ dart main.dart
Years after 2020: {2030, 2040}
Years up to 2030: {2000, 2010, 2020, 2030}
Years 2010-2030: {2010, 2020, 2030}
SplayTreeSet 中的自定义对象
使用自定义对象时,我们必须提供比较器或实现 Comparable。
main.dart
import 'dart:collection';
class Product implements Comparable<Product> {
final String name;
final double price;
Product(this.name, this.price);
@override
int compareTo(Product other) => price.compareTo(other.price);
@override
String toString() => '$name: \$$price';
}
void main() {
var products = SplayTreeSet<Product>();
products.addAll([
Product('Laptop', 999.99),
Product('Phone', 699.99),
Product('Tablet', 399.99)
]);
print(products);
}
Product 类实现 Comparable 来定义自然排序。SplayTreeSet 使用它来按价格对产品进行排序。
$ dart main.dart
{Tablet: $399.99, Phone: $699.99, Laptop: $999.99}
最佳实践
- 比较器选择:为自定义排序提供一致的比较器。
- 不可变元素:插入后避免修改元素。
- 范围查询:利用 from/to/range 进行高效的子集操作。
- 性能:注意操作的摊销 O(log n) 复杂度。
来源
本教程介绍了 Dart 的 SplayTreeSet,并通过实际示例演示了其关键功能和用于排序集合的用法模式。
作者
列出 所有 Dart 教程。