Dart LinkedListEntry
最后修改于 2025 年 6 月 8 日
在 Dart 中,LinkedListEntry
是 LinkedList
中元素的 असतात 基础基类。它提供了双向链表必需的链接结构,可以高效地遍历和修改元素。每个条目都维护着指向其下一个和上一个邻居的引用,确保了链表内顺畅的导航。
与依赖索引访问的标准列表不同,LinkedList
针对快速插入和删除进行了优化,无需元素移位。这使其非常适合需要频繁修改的场景,例如任务调度、撤销-重做功能和缓冲机制。
要使用 LinkedListEntry
,开发者必须扩展它来创建自定义条目类型。这允许每个条目存储额外的数据,同时仍然受益于 Dart 的 LinkedList
实现提供的自动列表管理。
LinkedListEntry
的主要特点
- 支持高效的插入和删除,无需移位元素。
- 维护下一个和上一个引用,方便遍历。
- 条目可以插入到现有元素之前或之后。
- 提供安全解除链接元素的方法。
通过利用 LinkedListEntry
,开发者可以有效地管理动态集合,同时确保快速的修改和可预测的遍历。
基本的 LinkedListEntry 用法
这是一个简单的示例,演示了如何创建和使用自定义的 LinkedListEntry 子类。
import 'dart:collection'; class PersonEntry extends LinkedListEntry<PersonEntry> { final String name; final int age; PersonEntry(this.name, this.age); @override String toString() => '$name ($age)'; } void main() { var list = LinkedList<PersonEntry>(); var alice = PersonEntry('Alice', 30); var bob = PersonEntry('Bob', 25); list.add(alice); list.add(bob); print(list); }
我们创建了一个扩展 LinkedListEntry 的 PersonEntry 类。然后我们创建一个 LinkedList 并添加两个条目。列表会保持插入的顺序。
$ dart main.dart (Alice (30), Bob (25))
访问相邻条目
LinkedListEntry
提供了 next
和 previous
属性来遍历列表。
import 'dart:collection'; class TaskEntry extends LinkedListEntry<TaskEntry> { final String description; TaskEntry(this.description); } void main() { var tasks = LinkedList<TaskEntry>(); var task1 = TaskEntry('Buy milk'); var task2 = TaskEntry('Walk dog'); var task3 = TaskEntry('Write code'); tasks.addAll([task1, task2, task3]); print('First task: ${task1.next?.description}'); print('Middle task previous: ${task2.previous?.description}'); print('Middle task next: ${task2.next?.description}'); print('Last task previous: ${task3.previous?.description}'); }
我们创建了一个任务链表,并演示了如何在条目之间导航。next 和 previous 属性在列表边界处返回 null。
$ dart main.dart First task: Walk dog Middle task previous: Buy milk Middle task next: Write code Last task previous: Walk dog
从列表中移除条目
可以通过调用条目上的 unlink
方法将其从列表中移除。
import 'dart:collection'; class NumberEntry extends LinkedListEntry<NumberEntry> { final int value; NumberEntry(this.value); @override String toString() => value.toString(); } void main() { var numbers = LinkedList<NumberEntry>(); var one = NumberEntry(1); var two = NumberEntry(2); var three = NumberEntry(3); numbers.addAll([one, two, three]); print('Before removal: ${numbers.map((e) => e.value).toList()}'); two.unlink(); print('After removal: ${numbers.map((e) => e.value).toList()}'); }
我们演示了如何从列表的中间移除一个条目。unlink
方法会移除该条目并更新相邻条目的链接。
$ dart main.dart Before removal: (1, 2, 3) After removal: (1, 3)
检查列表成员资格
LinkedListEntry
提供了一个 list 属性来检查一个条目是否在一个列表中。
import 'dart:collection'; class CityEntry extends LinkedListEntry<CityEntry> { final String name; CityEntry(this.name); } void main() { var cities = LinkedList<CityEntry>(); var ny = CityEntry('New York'); var la = CityEntry('Los Angeles'); print('Before adding:'); print('NY in list: ${ny.list != null}'); print('LA in list: ${la.list != null}'); cities.add(ny); cities.add(la); print('\nAfter adding:'); print('NY in list: ${ny.list != null}'); print('LA in list: ${la.list != null}'); ny.unlink(); print('\nAfter removing NY:'); print('NY in list: ${ny.list != null}'); print('LA in list: ${la.list != null}'); }
我们使用 list 属性检查列表成员资格。当条目不在任何列表中时,它返回 null;当它在一个列表中时,则返回 LinkedList
实例。
$ dart main.dart Before adding: NY in list: false LA in list: false After adding: NY in list: true LA in list: true After removing NY: NY in list: false LA in list: true
在其他条目之间插入条目
可以使用 insertBefore/After 在现有条目之间插入条目。
import 'dart:collection'; class ProductEntry extends LinkedListEntry<ProductEntry> { final String name; final double price; ProductEntry(this.name, this.price); @override String toString() => '$name: \$$price'; } void main() { var products = LinkedList<ProductEntry>(); var apple = ProductEntry('Apple', 0.99); var banana = ProductEntry('Banana', 1.49); products.addAll([apple, banana]); print('Original list: ${products.map((e) => e.toString()).toList()}'); var orange = ProductEntry('Orange', 1.29); apple.insertAfter(orange); print('After inserting orange: ${products.map((e) => e.toString()).toList()}'); var grape = ProductEntry('Grape', 2.99); banana.insertBefore(grape); print('After inserting grape: ${products.map((e) => e.toString()).toList()}'); }
我们演示了如何在列表的特定位置插入条目。插入操作会自动更新列表中的所有必要链接。
$ dart main.dart Original list: (Apple: $0.99, Banana: $1.49) After inserting orange: (Apple: $0.99, Orange: $1.29, Banana: $1.49) After inserting grape: (Apple: $0.99, Orange: $1.29, Grape: $2.99, Banana: $1.49)
最佳实践
- 单一列表成员资格:一个条目一次只能属于一个列表。
- 正确移除:在重用条目之前,请始终对其解除链接。
- 类型安全:使用特定类型参数扩展
LinkedListEntry
。 - 性能:插入和删除是 O(1) 操作。
来源
本教程通过实用的示例介绍了 Dart 的 LinkedListEntry
,演示了其主要特点和用法模式。
作者
列出 所有 Dart 教程。