24

有没有一种有效的方法可以在 dart 中以相反的顺序遍历列表中的对象?我可以使用索引,但这会导致性能下降(即,如果List<E>在内部使用链表构建)?

上下文:我正在从后到前绘制对象,但需要从前到后处理它们

阿里

4

3 回答 3

78

您现在可以在 Dart 中反转列表的迭代。在 List 上使用reversedgetter。

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 文档

于 2014-03-08T19:16:05.190 回答
9

在问题#2804得到修复之前,您必须使用索引以相反的顺序迭代列表。对于您的性能问题,应该很好,因为Lasse RH Nielsen 曾经说过

Dart 中的列表用于随机访问

于 2012-11-16T13:38:27.407 回答
0

如果有一个有效的向后迭代就好了。

同时,您可以做的是创建一个带有反向链接的列表。

例如

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);
        }
    }
}
于 2012-11-16T15:07:04.220 回答