vedo nella documentazione API v'è un metodo sort()
su List
, ma io non sono chiare ciò di cui ha bisogno per un parametro. L'attuale necessità è un semplice confronto diretto alfa.Come posso ordinare una lista di stringhe in Dart?
risposta
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.
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.
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.
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
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
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
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? :) –
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
Grazie a @munificent contento di sapere che verrà risolto presto. Vedi bug http://code.google.com/p/dart/issues/detail?id=1235 –