有没有一种有效的方法可以在 dart 中以相反的顺序遍历列表中的对象?我可以使用索引,但这会导致性能下降(即,如果List<E>
在内部使用链表构建)?
上下文:我正在从后到前绘制对象,但需要从前到后处理它们
阿里
有没有一种有效的方法可以在 dart 中以相反的顺序遍历列表中的对象?我可以使用索引,但这会导致性能下降(即,如果List<E>
在内部使用链表构建)?
上下文:我正在从后到前绘制对象,但需要从前到后处理它们
阿里
您现在可以在 Dart 中反转列表的迭代。在 List 上使用reversed
getter。
var fruits = ['apples', 'oranges', 'pears'];
Iterable inReverse = fruits.reversed;
var fruitsInReverse = inReverse.toList();
print(fruitsInReverse); // [pears, oranges, apples]
您可以将其缩短为:
var fruits = ['apples', 'oranges', 'pears'];
print(fruits.reversed.toList());
请参阅API 文档。
在问题#2804得到修复之前,您必须使用索引以相反的顺序迭代列表。对于您的性能问题,应该很好,因为Lasse RH Nielsen 曾经说过:
Dart 中的列表用于随机访问
如果有一个有效的向后迭代就好了。
同时,您可以做的是创建一个带有反向链接的列表。
例如
class BackwardsLinked {
// properties, methods etc.
// as an example, just an int
int value;
BackwardsLinked(this.value);
BackwardsLinked previousItem;
String toString() => "[$value]";
}
void main() {
// setting up the list
var list = new List<BackwardsLinked>();
var anchor = new BackwardsLinked(0);
anchor.previousItem = null;
list.add(anchor);
for (int i = 1; i < 10; i++) {
list.add(new BackwardsLinked(i * 3));
list[i].previousItem = list[i - 1];
}
BackwardsLinked terminal = list[list.length - 1];
// Iteration
print("Forwards, as usual:");
for (BackwardsLinked link in list) {
// Do whatever with object
print(link);
}
print("Backwards:");
{
BackwardsLinked link = terminal;
print(terminal);
while (link.previousItem != null) {
link = link.previousItem;
// Do whatever with object
print(link);
}
}
}