ZetCode

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}

最佳实践

来源

Dart LinkedHashMap 文档

本教程介绍了 Dart 的 LinkedHashMap,并通过示例展示了其有序性以及与普通 HashMap 相比的关键特性。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Dart 教程