ZetCode

Dart ListQueue

最后修改于 2025 年 6 月 8 日

在 Dart 中,ListQueueQueue 接口的一个高性能、基于列表的实现。它旨在实现两端的高效插入和移除,为这些操作提供 O(1) 的时间复杂度。这使其非常适合需要频繁在队列的前后进行修改的场景。

与需要修改前端时移动元素的标准 List 不同,ListQueue 在内部使用循环缓冲区。这确保了即使队列动态增长,添加和移除元素的速度也能保持很快。

ListQueue 的主要特点

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

创建 ListQueue

我们可以使用其构造函数或从现有可迭代对象创建 ListQueue

main.dart
import 'dart:collection';

void main() {
  var queue = ListQueue<String>();
  queue.add('apple');
  queue.add('banana');
  queue.add('orange');

  print(queue);
}

这会创建一个空的 ListQueue 并添加三个元素。泛型类型参数指定元素类型为 String

$ dart main.dart
{apple, banana, orange}

添加元素

ListQueue 提供了多种方法,可以在不同位置添加元素。

main.dart
import 'dart:collection';

void main() {
  var queue = ListQueue.of([1, 2, 3]);
  
  queue.add(4);
  queue.addFirst(0);
  queue.addAll([5, 6]);
  
  print(queue);
}

of 方法从可迭代对象创建队列。我们演示了向队列的两端添加元素。addFirst 对于队列操作特别有用。

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

移除元素

ListQueue 提供了几种从集合中移除元素的方法。

main.dart
import 'dart:collection';

void main() {
  var queue = ListQueue.of(['a', 'b', 'c', 'd', 'e']);
  
  var first = queue.removeFirst();
  var last = queue.removeLast();
  queue.remove('c');
  
  print('Removed: $first, $last');
  print('Remaining: $queue');
}

这展示了 FIFO(removeFirst)和 LIFO(removeLast)操作。remove 方法删除指定值的第一个匹配项。

$ dart main.dart
Removed: a, e
Remaining: {b, d}

访问元素

ListQueue 同时支持队列式访问和基于索引的元素检索。

main.dart
import 'dart:collection';

void main() {
  var queue = ListQueue.of([10, 20, 30, 40, 50]);
  
  print('First: ${queue.first}');
  print('Last: ${queue.last}');
  print('Element at 2: ${queue.elementAt(2)}');
  
  print('All elements:');
  for (var item in queue) {
    print(item);
  }
}

ListQueue 保持列表般的特性,同时提供队列操作。我们可以按位置访问元素或遍历它们。

$ dart main.dart
First: 10
Last: 50
Element at 2: 30
All elements:
10
20
30
40
50

队列操作

ListQueue 以高效的性能实现了标准队列操作。

main.dart
import 'dart:collection';

void main() {
  var queue = ListQueue<int>();
  
  // Enqueue elements
  queue.addLast(1);
  queue.addLast(2);
  queue.addLast(3);
  
  // Dequeue elements
  while (queue.isNotEmpty) {
    print('Processing: ${queue.removeFirst()}');
  }
  
  print('Queue empty: ${queue.isEmpty}');
}

这展示了经典的 FIFO 队列行为。元素被添加到末尾并从前端移除。isNotEmpty 检查比检查长度更安全。

$ dart main.dart
Processing: 1
Processing: 2
Processing: 3
Queue empty: true

最佳实践

来源

Dart ListQueue 文档

本教程涵盖了 Dart 的 ListQueue,并提供了实际示例,演示了其关键功能和使用模式,以实现高效的队列操作。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了超过 1,400 篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程