Dart Сортировка списка объектов по убыванию

В этом руководстве мы покажем вам несколько способов и функций для сортировки списка объектов по убыванию в Dart/Flutter.

Это похоже на сортировку по возрастанию, но вы можете сделать это тремя способами:

  • используя пользовательскую функцию сравнения.
  • Расширение абстрактного класса Comparable, переопределение метода compareTo() и использование reversed.
  • Расширение абстрактного класса Comparable, переопределение метода compareTo() и использование библиотеки fast_immutable_collections.

Полный текст сообщения: Dart/Flutter Sort Список объектов

Dart/Flutter Сортировка списка объектов по убыванию с использованием пользовательской функции сравнения

Передайте пользовательскую функцию сравнения в метод sort() списка, поменяв местами элементы.

class Customer {
  String name;
  int age;

  Customer(this.name, this.age);

  @override
  String toString() {
    return '{ ${this.name}, ${this.age} }';
  }
}

main() {
  List<Customer> customers = [];
  customers.add(Customer('Jack', 23));
  customers.add(Customer('Adam', 27));
  customers.add(Customer('Katherin', 25));

  customers.sort((a, b) => b.age.compareTo(a.age));
  print('Sort by Age: ' + customers.toString());

  customers.sort((a, b) => b.name.compareTo(a.name));
  print('Sort by Name: ' + customers.toString());
}
Вход в полноэкранный режим Выход из полноэкранного режима

Выход:

Sort by Age: [{ Adam, 27 }, { Katherin, 25 }, { Jack, 23 }]
Sort by Name: [{ Katherin, 25 }, { Jack, 23 }, { Adam, 27 }]

Dart/Flutter Сортировка списка объектов по убыванию с использованием абстрактного класса Comparable

Мы можем отсортировать список объектов в порядке убывания, используя свойство reversed. Оно возвращает Iterable объектов в списке.

class Customer extends Comparable {
  String name;
  int age;

  Customer(this.name, this.age);

  @override
  String toString() {
    return '{ ${this.name}, ${this.age} }';
  }

  // sort by Name (asc)
  @override
  int compareTo(other) {
    return this.name.compareTo(other.name);
  }
}

main() {
 List<Customer> customers = [];
  customers.add(Customer('Jack', 23));
  customers.add(Customer('Adam', 27));
  customers.add(Customer('Katherin', 25));

  customers.reversed.toList();
  print(customers);
}
Вход в полноэкранный режим Выход из полноэкранного режима

Выход:

[{ Katherin, 25 }, { Jack, 23 }, { Adam, 27 }]

Сначала мы расширяем абстрактный класс Comparable и переопределяем метод compareTo(), затем вызываем list.reversed.toList().

.reversed НЕ инвертирует список. Вместо этого он сортирует исходный список в порядке возрастания, а затем возвращает нисходящий Iterable. Поэтому нам нужен .toList(), наконец.

Однако как быть с большими списками?
Давайте рассмотрим другой подход.

Dart/Flutter Сортировка списка объектов по убыванию с помощью библиотеки

Мы можем создать свои неизменяемые коллекции и использовать библиотеку Fast Immutable Collections напрямую.
Класс такой же, как и в предыдущем подходе (расширяет Comparable и переопределяет метод compareTo()). Но он использует sortReversed(), что гораздо быстрее.

import 'package:fast_immutable_collections/fast_immutable_collections.dart';

class Customer extends Comparable {
  ...
  @override
  int compareTo(other) {
    return this.name.compareTo(other.name);
  }
}

main() {
 List<Customer> customers = [];
  customers.add(Customer('Jack', 23));
  customers.add(Customer('Adam', 27));
  customers.add(Customer('Katherin', 25));

  customers.sortReversed();
  print(customers);
}
Вход в полноэкранный режим Выход из полноэкранного режима

Выход:

[{ Katherin, 25 }, { Jack, 23 }, { Adam, 27 }]

Дальнейшее чтение

  • Учебник по Dart/Flutter List с примерами
  • Dart/Flutter Конструкторы — учебник с примерами
  • Dart/Flutter String Methods & Operators учебник с примерами
  • Dart/Flutter Future Учебник с примерами
  • Dart/Flutter Map Учебник с примерами

  • Dart/Flutter — Преобразование объекта в строку JSON

  • Dart/Flutter — Преобразование/разбор строки JSON, массива в объект, список

  • Dart/Flutter — Преобразование списка в карту & карты в список

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *