Как я могу отсортировать список строк в Dart?

В API-документах API есть метод sort() на List, но я не понимаю, что ему нужно для параметра. Текущая потребность в очень простом альфа-сравнении.

Ответ 1

Спасибо за вопрос! Вы можете отсортировать список строк следующим образом:

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

Вышеприведенный код печатает:

apples, bananas, oranges

Обратите внимание, что sort() не возвращает значение. Он сортирует список без создания нового списка. Если вы хотите сортировать и печатать в одной строке, вы можете использовать каскады методов:

print(fruits..sort());

Для большего контроля вы можете определить свою собственную логику сравнения. Вот пример сортировки фруктов по цене.

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

Посмотрите, что здесь происходит.

A List имеет метод sort, который имеет один необязательный параметр: a Comparator. Компаратор представляет собой typedef или псевдоним функции. В этом случае это псевдоним для функции, которая выглядит следующим образом:

int Comparator(T a, T b)

Из документов:

Функция компаратора представляет такое полное упорядочение, возвращая отрицательное целое число, если a меньше b, ноль, если a равно b, и положительное целое число, если a больше b.

Ответ 2

Вот однострочный код для его достижения.

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

Ответ 3

Ленивая сортировка (позволяет сортировать пустые значения).
Результат IEnumerable.

Пользовательский компаратор может быть передан в качестве аргумента.

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());
}

Выход:

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

Другой способ при использовании Dart '>=2.6.0-dev.7.0.

import 'package:enumerable/enumerable.dart';

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

Ответ 4

Чтобы добавить только один пункт к подробному ответу Сета, в общем, в

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

прошедшего в sort, функция foo должна ответить на целочисленный результат следующим образом:

  • если a < b, результат должен быть < 0,
  • если a = b, результат должен быть = 0, а
  • если a > b, результат должен быть > 0.

Для того чтобы вышеприведенный закон трихотомии держать, как a, так и b должен быть Comparable s.

Ответ 5

После сегодняшнего дня вы должны просто сделать list.sort(). Аргумент метода сортировки теперь является необязательным, и по умолчанию используется функция, которая вызывает compareTo для самих элементов. Поскольку String Comparable, он должен просто работать сейчас.