2012-11-16 103 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