是否有一种有效的方法可以在dart中以相反的顺序迭代列表中的对象?我可以使用索引,但这会导致性能下降(即如果List<E>
是使用链接列表在内部构建的)?
上下文:我从后到前绘制对象,但需要从前到后处理它们
阿里
答案 0 :(得分:20)
您现在可以在Dart中反转列表的迭代。使用列表上的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 docs。
答案 1 :(得分:5)
在问题#2804已经修复之前,您必须使用索引以相反的顺序迭代列表。对于您的性能问题,它应该是好的,因为Lasse R.H. Nielsen once said:
Dart中的列表用于随机访问
答案 2 :(得分:0)
如果有一个有效的向后迭代会很好。
与此同时,您可以做的是创建一个带有向后链接的列表。
e.g。
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);
}
}
}