Dart:进入前置后的DoubleLinkedQueue长度

时间:2015-03-12 04:50:53

标签: dart queue

我正在通过DoubleLinkedQueueElement.append / prepend方法操作DoubleLinkedQueue中的条目。这会导致新元素插入到队列中,但无法更新长度,并且toList()方法会导致抛出错误。

我理解队列只应该在开头/结尾添加元素,但看起来接口应该允许通过条目添加到中间。我发现很难相信这样一个普遍/易于理解的数据结构会有一个错误 - 所以我使用DoubleLinkedQueues错误吗?我应该使用另一种数据结构吗?我正在寻找将来自另一个iterable的值合并到我自己的已排序的iterable中 - 一个SplayTreeSet可能会在n log n时间内让我在那里,但是一个简单的合并应该让我在线性时间内...

意外行动的代码示例:

main() {
  var q = new DoubleLinkedQueue<int>.from([1]);
  q.firstEntry().prepend(0);
  print('length: ${q.length}');
  int i = 0;
  for (var qi in q){
    print('${i++}: $qi');
  }
}

输出:

length: 1
0: 0
1: 1

1 个答案:

答案 0 :(得分:0)

看起来长度getter只指向内部计数器。这样做是因为每次计算元素对于长列表可能需要很长时间。

只有在使用直接操作列表的方法而不是使用元素的prepend方法时,才会更新内部计数器。在您的示例中,您应该使用q.addFirst(0);,这会导致更新的长度。 .prepend()方法只是插入一个新元素并更改指针。这导致了元素的正确遍历,但反正计数器也是错误的。

不幸的是,看起来你不能在列表中间插入元素,也不能让列表重新计算元素。您应该考虑在www.dartbug.com上创建一个错误。

//更新:

toList()会抛出错误,因为元素多于length