ZetCode

Dart 队列

最后修改于 2025 年 6 月 8 日

在 Dart 中,Queue 是一个动态集合,它实现了双端队列(deque),允许在两端高效地插入和删除元素。默认情况下,它遵循 FIFO(先进先出)原则,这意味着元素按添加的顺序进行处理。

与提供基于索引访问的标准 List 不同,Queue 针对两端的快速修改进行了优化,无需移动元素。这使其成为任务调度、缓冲和撤销/重做操作等场景的理想选择。

队列的关键特性

通过利用 Queue,开发人员可以有效地管理需要两端快速修改的集合,使其成为基于队列操作的传统列表的强大替代品。

创建队列

创建 Queue 最简单的方法是使用 dart:collection 库中的 Queue 工厂构造函数。您可以创建一个空队列,或使用其他集合中的元素对其进行初始化。

Queue 类是泛型的,允许您指定它将保存的元素的类型。这确保了类型安全,并允许队列仅存储指定类型的元素。该工厂构造函数创建 ListQueue 的新实例,ListQueueQueue 接口的具体实现。

factory Queue() = ListQueue<E>;

它使用可调整大小的数组来存储元素,提供高效的访问和修改操作。Queue 类实现了 Iterable 接口,允许您使用标准的迭代方法来迭代其元素。它还提供了用于添加、删除和检查元素的各种方法,使其成为管理 Dart 中集合的通用选择。

main.dart
import 'dart:collection';

void main() {
  var queue = Queue<String>();
  queue.add('Apple');
  queue.add('Banana');
  queue.add('Cherry');

  print(queue);
}

我们创建一个 String 类型的 Queue 并添加三个元素。add 方法将元素附加到队列的末尾。泛型类型指定了元素的类型。

$ dart main.dart
{Apple, Banana, Cherry}

向队列添加元素

Queue 提供了多种在两端添加元素的方法。

main.dart
import 'dart:collection';

void main() {
  var queue = Queue<int>();
  
  // Add to end
  queue.add(1);
  queue.addLast(2);
  
  // Add to beginning
  queue.addFirst(0);
  
  // Add multiple
  queue.addAll([3, 4]);
  
  print(queue);
}

我们演示了各种添加方法。add 和 addLast 在末尾添加,而 addFirst 在开头添加。addAll 一次添加多个元素。

$ dart main.dart
{0, 1, 2, 3, 4}

从队列中移除元素

Queue 提供了高效地从两端移除元素的方法。

main.dart
import 'dart:collection';

void main() {
  var queue = Queue.from([10, 20, 30, 40, 50]);
  
  // Remove from start
  var first = queue.removeFirst();
  
  // Remove from end
  var last = queue.removeLast();
  
  // Remove specific element
  queue.remove(30);
  
  print('Removed: $first, $last');
  print('Remaining: $queue');
}

removeFirstremoveLast 从两端高效移除。remove 删除第一次出现的某个值。所有这些方法都会就地修改队列。

$ dart main.dart
Removed: 10, 50
Remaining: {20, 40}

队列操作

Queue 提供了用于检查和修改的各种操作。

main.dart
import 'dart:collection';

void main() {
  var queue = Queue.from(['Red', 'Green', 'Blue']);
  
  // Check properties
  print('First: ${queue.first}');
  print('Last: ${queue.last}');
  print('Length: ${queue.length}');
  print('Is empty: ${queue.isEmpty}');
  
  // Clear queue
  queue.clear();
  print('After clear: $queue');
}

我们演示了常见的 Queue 操作。first 和 last 在不移除的情况下查看元素。lengthisEmpty 检查大小。clear 移除所有元素。

$ dart main.dart
First: Red
Last: Blue
Length: 3
Is empty: false
After clear: {}

迭代队列

可以使用标准的迭代方法来迭代队列。

main.dart
import 'dart:collection';

void main() {
  var queue = Queue.from([1, 2, 3, 4, 5]);
  
  // For-in loop
  print('For-in:');
  for (var num in queue) {
    print(num);
  }
  
  // forEach
  print('\nforEach:');
  queue.forEach(print);
  
  // Iterator
  print('\nIterator:');
  var it = queue.iterator;
  while (it.moveNext()) {
    print(it.current);
  }
}

我们展示了迭代 Queue 的三种方法。for-in 循环最常见。forEach 提供了一种函数式的方法。Iterator 提供了手动控制。

最佳实践

来源

Dart 队列文档

本教程通过实际示例涵盖了 Dart 的 Queue,展示了其关键特性和用法模式。

作者

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

列出 所有 Dart 教程