2012-11-16 17 views
5

Esiste un modo efficace per scorrere gli oggetti nell'elenco in ordine inverso nel dardo? Potrei usare gli indici, ma ciò causerà un calo di prestazioni (ad esempio, se List<E> viene creato internamente utilizzando l'elenco collegato)?Iteratore inverso per elenco?

Contesto: Sto disegnando oggetti da dietro in avanti, ma è necessario elaborarle da davanti a dietro

Ali

risposta

4

Fino all'emanazione #2804 è stato fisso, è necessario scorrere la lista in ordine inverso usando indici. Per le prestazioni preoccupazione, dovrebbe essere buono perché Lasse R.H. Nielsen once said:

liste a Dart sono destinati per l'accesso casuale

+0

Grazie. Rimarrò con gli indici per ora –

+2

Dart ora ha una soluzione. Controlla la mia risposta alla domanda. Spero possa aiutare! –

0

Sarebbe bello se ci fosse un efficiente all'indietro iterazione.

Nel frattempo, ciò che si potrebbe fare è creare una lista con collegamenti a ritroso.

ad es.

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

È ora possibile invertire l'iterazione di un elenco in Freccetta. Utilizzare il getter reversed nell'elenco.

var fruits = ['apples', 'oranges', 'pears']; 
Iterable inReverse = fruits.reversed; 
var fruitsInReverse = inReverse.toList(); 
print(fruitsInReverse); // [pears, oranges, apples] 

Si potrebbe ridurre questo per:

var fruits = ['apples', 'oranges', 'pears']; 
print(fruits.reversed.toList()); 

Vedere le API docs.

Problemi correlati