web-dev-qa-db-fra.com

Comment trier une liste de chaînes dans Dart?

Je vois dans la documentation de l'API qu'il y a une méthode sort() sur List, mais je ne sais pas ce dont elle a besoin pour un paramètre. Le besoin actuel est une comparaison alpha simple et directe.

32
george koller

Merci pour la question! Vous pouvez trier une liste de chaînes comme celle-ci:

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

Le code ci-dessus imprime:

apples, bananas, oranges

Notez que sort() ne renvoie pas de valeur. Il trie la liste sans créer de nouvelle liste. Si vous souhaitez trier et imprimer sur la même ligne, vous pouvez utiliser la méthode cascades :

print(fruits..sort());

Pour plus de contrôle, vous pouvez définir votre propre logique de comparaison. Voici un exemple de tri des fruits en fonction du prix.

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

Voyons ce qui se passe ici.

Une liste a une méthode sort , qui a un paramètre facultatif : a comparateur . Un comparateur est un typedef ou alias de fonction. Dans ce cas, c'est un alias pour une fonction qui ressemble à:

int Comparator(T a, T b)

De la documentation:

Une fonction de comparaison représente un tel ordre total en renvoyant un entier négatif si a est inférieur à b, zéro si a est égal à b et un entier positif si a est supérieur à b.

38
Seth Ladd

Voici le code d'une ligne pour y parvenir.

fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
8
Paras khandelwal

Tri paresseux (permet de trier les valeurs nullables).
Le résultat est IEnumerable.

Le comparateur personnalisé peut être passé en argument.

import 'package:queries/collections.Dart';

void main() {
  var strings = ["c", "bb", "b", "cc", null, "a", 'ccc'];
  var data = new Collection<String>(strings);
  var query = data.orderBy((s) => s).thenBy((s) => s.length);  
  print(query.asIterable());  
  print(query.toList());
}

Production:

(null, a, b, bb, c, cc, ccc)
[null, a, b, bb, c, cc, ccc]
6
mezoni

Pour ajouter un seul point à la réponse détaillée de Seth, en général,

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

passée dans sort, la fonction foo devrait répondre à un résultat entier comme suit:

  • si a <b, le résultat doit être <0,
  • si a = b, le résultat doit être = 0, et
  • si a> b, le résultat doit être> 0.

Pour que la loi de trichotomie ci-dessus se vérifie, a et b doivent être Comparables.

4

Après aujourd'hui, vous devriez juste pouvoir faire list.sort (). L'argument de la méthode de tri est désormais facultatif, et par défaut, il s'agit d'une fonction qui appelle compareTo sur les éléments eux-mêmes. Puisque String est comparable, il devrait simplement fonctionner maintenant.

1
Lasse Nielsen