2012-10-15 21 views

risposta

12

Grazie per la domanda! È possibile ordinare un elenco di stringhe in questo modo:

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort(); 
    print(fruits); 
} 

Le stampe di codice di cui sopra:

apples, bananas, oranges 

noti che sort() non restituisce un valore. Ordina l'elenco senza creare un nuovo elenco. Se si desidera ordinare e stampare nella stessa linea, è possibile utilizzare il metodo cascate:

print(fruits..sort()); 

Per un maggiore controllo, è possibile definire la propria logica di confronto. Ecco un esempio di ordinare i frutti in base al prezzo.

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b))); 
    print(fruits); 
} 

Vediamo cosa sta succedendo qui.

Un elenco ha un metodo sort, che ha un parametro facoltativo: uno Comparator. Un comparatore è un typedef o alias di funzione. In questo caso, è un alias per una funzione che assomiglia:

int Comparator(T a, T b) 

Dalla documentazione:

Una funzione comparatore rappresenta un ordinamento così totale restituendo un intero negativo se a è minore di b, zero se a è uguale a b, e un numero intero positivo se a è maggiore di b.

+0

Grazie! Mi dispiace lamentarmi, ma mentre sto cercando di apprezzare l'apparente versatilità di quanto sopra, non lo trovo intuitivo o in linea con l'esperienza linguistica precedente. Ragazzi, avete qualcuno con un topo di legno quadrato e una lunga barba grigia che viene fuori con una di queste cose? :) –

+1

Questo è un artefatto storico strano. Il comparatore dovrebbe essere opzionale. In passato, abbiamo modificato la sintassi dei parametri opzionali qualche tempo fa, il che ci obbligava a rendere tutti i parametri non opzionali per un po ', incluso questo. Non abbiamo ancora avuto la possibilità di risolvere questo problema e renderlo nuovamente opzionale. – munificent

+0

Grazie a @munificent contento di sapere che verrà risolto presto. Vedi bug http://code.google.com/p/dart/issues/detail?id=1235 –

2

Per aggiungere un solo punto alla risposta dettagliata di Seth, in generale, in

(a, b) => foo(a, b) 

passato nel sort, la funzione foo dovrebbe rispondere un risultato intero come segue:

  • se un < b, risultato dovrebbe essere < 0,
  • se a = b, risultato deve essere = 0, e
  • se a> b, risultato dovrebbe essere> 0.

Per la legge al di sopra di tricotomia da tenere, sia a e b deve essere Comparable s.

0

Dopo oggi, si dovrebbe solo essere in grado di fare list.sort(). L'argomento del metodo sort è ora facoltativo e ha come valore predefinito una funzione che chiama compareTo sugli elementi stessi. Poiché String è paragonabile, dovrebbe funzionare ora.

+0

Il metodo sort() della lista è mai stato risolto per non richiedere una funzione di confronto? O c'era una regressione? Sto usando Dart 0.2.6.0_r15355 su Ubuntu 12.04 e ottenendo i seguenti risultati: [3,1,2] .sort() == null e ['a', 'c', 'b']. Ordina () == null. – devdanke

+0

Oops! Dart stava ordinando l'array :-) Ma la funzione sort() restituisce void :-(Quindi "print ([3,1,2] .sort())" "output" null ". In questo caso, gli sviluppatori di Dart sono non implementare uno stile di programmazione fluente, vorrei che lo facessero, perché in questo caso si potrebbe usare immediatamente il risultato di chiamare sort(). – devdanke

2

Pigro ordinamento. Il risultato è IQueryable.

Il comparatore personalizzato può essere passato come argomento.

import 'package:queries/collections.dart'; 

void main() { 
    var fruits = ["grape", "passionfruit", "banana", "mango", 
       "orange", "raspberry", "apple", "blueberry"]; 

    var sorted = new Collection(fruits) 
    .orderBy((fruit) => fruit.length) 
    .thenBy((fruit) => fruit); 

    for(var fruit in sorted) { 
    print(fruit); 
    } 
} 

uscita:

mango 
banana 
orange 
blueberry 
raspberry 
passionfruit 
Problemi correlati