2012-11-16 56 views
5

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

语境:我画从后到前的对象,但需要从正面处理它们向后

阿里

回答

4

直到问题#2804一直固定,你必须遍历列表使用索引的逆序。为了您的性能问题,它应该是一件好事,因为Lasse R.H. Nielsen once said:在DART

列表用于随机存取

+0

谢谢。我现在坚持使用指数 –

+2

Dart现在有一个解决方案。检查我对这个问题的回答。希望有所帮助! –

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); 
     } 
    } 
} 
10

您现在可以颠倒Dart中列表的迭代。在List上使用reversed获得者。

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