Flutter how to sort lisy by a-z or z-a

Viewed 148

I have a simple list like this

[{Name: Black},{Name: Redblack},{Name: Aedblack}]

I need to sort this by a-z and z-a

4 Answers

Firstly you can create a map list like that

List<Map> myList = [
  { 'Name' : 'Black',},
  { 'Name' : 'Redblack'},
  { 'Name' : 'Aedblack'},
];

And then, you can access the value of this element and sort using built-in function.

   myList.sort((a, b) => a["Name"].compareTo(b["Name"]));

And if you want to sort reverse, just add it to "-" like that;

   myList.sort((a, b) => -a["Name"].compareTo(b["Name"]));

I assume that you have a ColorModel list like this:

import 'dart:convert';

List<ColorModel> colorModelFromJson(String str) => List<ColorModel>.from(json.decode(str).map((x) => ColorModel.fromJson(x)));

String colorModelToJson(List<ColorModel> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class ColorModel {
    ColorModel({
        this.name,
    });

    String name;

    factory ColorModel.fromJson(Map<String, dynamic> json) => ColorModel(
        name: json["Name"] == null ? null : json["Name"],
    );

    Map<String, dynamic> toJson() => {
        "Name": name == null ? null : name,
    };
}

And you generated your list with the following method:

  void addList() {
    modelList.add(ColorModel(name: "Black"));
    modelList.add(ColorModel(name: "Redblack"));
    modelList.add(ColorModel(name: "Aedblack"));
  }

Now you can sort this list with:

  void sortList() {
    modelList.sort((a, b) => a.name.compareTo(b.name));
  }
void main(List<String> args) {
  var data = [{'Name': 'Black'},{'Name': 'Redblack'},{'Name': 'Aedblack'}];
  var sorted = data.map((m) => m['Name']).toList()..sort();
  var newData = List<Map<String,String>>.generate(data.length, (i) => {'Name': sorted[i]});

  print(newData);
}

Another simple way:

data.sort((a,b) => a['Name'].compareTo(b['Name']));

Result:

[{Name: Aedblack}, {Name: Black}, {Name: Redblack}]

You can have your domain class implement the Comparable interface.

Here is a basic example for a class Person that would sort by age and then by name:

class Person implements Comparable {
  final String name;
  final int age;

  Person({this.name, this.age});

  @override
  int compareTo(other) {
    final ageDiff = age.compareTo(other.age);
    return ageDiff != 0 ? ageDiff : name.compareTo(other.name);
  }

  @override
  String toString() => '$name, $age years old';
}

Full source code

import 'package:faker/faker.dart';

void main() {
  print('BEFORE');
  persons.forEach((person) => print(person));
  persons.sort();
  print('SORTED');
  persons.forEach((person) => print(person));
  print('REVERSED');
  persons.reversed.forEach((person) => print(person));
}

class Person implements Comparable {
  final String name;
  final int age;

  Person({this.name, this.age});

  @override
  int compareTo(other) {
    final ageDiff = age.compareTo(other.age);
    return ageDiff != 0 ? ageDiff : name.compareTo(other.name);
  }

  @override
  String toString() => '$name, $age years old';
}

final faker = Faker();
final persons = List.generate(
  12,
  (index) => Person(
    name: faker.person.name(),
    age: 18 + faker.randomGenerator.integer(3),
  ),
);

Results

Restarted application in 170ms.

BEFORE

Kaelyn Hoeger, 18 years old
Kayleigh Schuster, 19 years old
Mrs. Sabryna Hilpert, 18 years old
Abbigail D'Amore, 19 years old
Esta Yundt, 20 years old
Friedrich Lang, 20 years old
Herman Stokes, 19 years old
Elenora Bode, 20 years old
Ida Rodriguez, 18 years old
Mrs. Chandler Romaguera I, 19 years old
Madeline Kulas, 19 years old
Rozella Pacocha, 19 years old

SORTED

Ida Rodriguez, 18 years old
Kaelyn Hoeger, 18 years old
Mrs. Sabryna Hilpert, 18 years old
Abbigail D'Amore, 19 years old
Herman Stokes, 19 years old
Kayleigh Schuster, 19 years old
Madeline Kulas, 19 years old
Mrs. Chandler Romaguera I, 19 years old
Rozella Pacocha, 19 years old
Elenora Bode, 20 years old
Esta Yundt, 20 years old
Friedrich Lang, 20 years old

REVERSED

Friedrich Lang, 20 years old
Esta Yundt, 20 years old
Elenora Bode, 20 years old
Rozella Pacocha, 19 years old
Mrs. Chandler Romaguera I, 19 years old
Madeline Kulas, 19 years old
Kayleigh Schuster, 19 years old
Herman Stokes, 19 years old
Abbigail D'Amore, 19 years old
Mrs. Sabryna Hilpert, 18 years old
Kaelyn Hoeger, 18 years old
Ida Rodriguez, 18 years old
Related