Dart LinkedHashMap
最后修改于 2025 年 4 月 4 日
在 Dart 中,LinkedHashMap 是一个有序的键值对集合。它在提供快速查找操作的同时,保留了插入顺序。
LinkedHashMap 使用哈希表和链表实现了 Map 接口。这种组合在保持 O(1) 键访问时间的同时,也保留了顺序。
创建 LinkedHashMap
可以通过构造函数或从另一个 Map 创建 LinkedHashMap。
main.dart
import 'dart:collection';
void main() {
var orderedCapitals = LinkedHashMap<String, String>();
orderedCapitals['USA'] = 'Washington';
orderedCapitals['Japan'] = 'Tokyo';
orderedCapitals['France'] = 'Paris';
print(orderedCapitals);
}
我们创建一个国家-首都对的 LinkedHashMap。与普通的 HashMap 不同,条目将按插入顺序打印。
$ dart main.dart
{USA: Washington, Japan: Tokyo, France: Paris}
LinkedHashMap.from
我们可以从现有 Map 创建 LinkedHashMap,同时保留顺序。
main.dart
import 'dart:collection';
void main() {
var unordered = {'z': 1, 'a': 2, 'm': 3};
var ordered = LinkedHashMap.from(unordered);
print('Original: $unordered');
print('LinkedHashMap: $ordered');
}
LinkedHashMap.from 构造函数创建一个具有相同条目的新 Map。插入顺序会从原始 Map 的迭代顺序中保留下来。
$ dart main.dart
Original: {z: 1, a: 2, m: 3}
LinkedHashMap: {z: 1, a: 2, m: 3}
保持插入顺序
即使在修改条目时,LinkedHashMap 也会保留插入顺序。
main.dart
import 'dart:collection';
void main() {
var tasks = LinkedHashMap<int, String>();
tasks[1] = 'Buy groceries';
tasks[2] = 'Clean house';
tasks[3] = 'Pay bills';
// Modify existing entry
tasks[2] = 'Deep clean house';
// Add new entry
tasks[4] = 'Walk dog';
print(tasks);
}
修改现有值不会改变其在迭代顺序中的位置。新条目始终添加到迭代序列的末尾。
$ dart main.dart
{1: Buy groceries, 2: Deep clean house, 3: Pay bills, 4: Walk dog}
访问第一个和最后一个元素
LinkedHashMap 提供对第一个和最后一个条目的便捷访问。
main.dart
import 'dart:collection';
void main() {
var colors = LinkedHashMap<String, String>();
colors['red'] = '#FF0000';
colors['green'] = '#00FF00';
colors['blue'] = '#0000FF';
print('First key: ${colors.keys.first}');
print('Last value: ${colors.values.last}');
print('First entry: ${colors.entries.first}');
}
我们可以通过键、值或条目来访问第一个和最后一个元素。这对于 LinkedHashMap 等有序集合特别有用。
$ dart main.dart First key: red Last value: #0000FF First entry: MapEntry(red: #FF0000)
删除元素同时保持顺序
从 LinkedHashMap 中删除元素会保持剩余条目的顺序。
main.dart
import 'dart:collection';
void main() {
var inventory = LinkedHashMap<String, int>();
inventory['apples'] = 10;
inventory['bananas'] = 5;
inventory['oranges'] = 8;
inventory['pears'] = 12;
print('Original: $inventory');
inventory.remove('bananas');
print('After remove: $inventory');
inventory.removeWhere((key, value) => value < 9);
print('After removeWhere: $inventory');
}
删除条目时,剩余元素会保持其原始顺序。removeWhere 方法根据条件进行过滤,同时保持顺序。
$ dart main.dart
Original: {apples: 10, bananas: 5, oranges: 8, pears: 12}
After remove: {apples: 10, oranges: 8, pears: 12}
After removeWhere: {apples: 10, pears: 12}
最佳实践
- 顺序很重要:当插入顺序很重要时,请使用 LinkedHashMap。
- 内存考虑:LinkedHashMap 比 HashMap 使用更多的内存。
- 性能:两者都有 O(1) 访问时间,但 LinkedHashMap 有额外的开销。
- 键的一致性:确保键具有正确的 hashCode 和 == 实现。
来源
本教程介绍了 Dart 的 LinkedHashMap,并通过示例展示了其有序性以及与普通 HashMap 相比的关键特性。
作者
列出 所有 Dart 教程。