列表的反向迭代器?

时间:2012-11-16 12:06:28

标签: dart

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

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

阿里

3 个答案:

答案 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);
        }
    }
}