我正在通过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
答案 0 :(得分:0)
看起来长度getter只指向内部计数器。这样做是因为每次计算元素对于长列表可能需要很长时间。
只有在使用直接操作列表的方法而不是使用元素的prepend方法时,才会更新内部计数器。在您的示例中,您应该使用q.addFirst(0);
,这会导致更新的长度。 .prepend()
方法只是插入一个新元素并更改指针。这导致了元素的正确遍历,但反正计数器也是错误的。
不幸的是,看起来你不能在列表中间插入元素,也不能让列表重新计算元素。您应该考虑在www.dartbug.com上创建一个错误。
//更新:
toList()
会抛出错误,因为元素多于length
。