ZetCode

Dart 列表排序

最后修改日期:2024 年 1 月 28 日

在本文中,我们将展示如何在 Dart 语言中对列表元素进行排序。

排序

排序是将元素按有序序列排列。过去,人们开发了多种算法来执行数据排序,包括归并排序、快速排序、选择排序或冒泡排序。

洗牌(shuffling),与排序相反,是将元素序列重新排列成随机或无序的顺序。

数据可以按字母顺序或数字顺序进行排序。排序键指定了用于执行排序的标准。可以按多个键对对象进行排序。例如,在对用户进行排序时,用户姓名可用作主要排序键,他们的职业可用作次要排序键。

Dart 整数列表排序

在第一个示例中,我们对整数进行排序。

main.dart
void main() {
  var nums = <int>[2, 1, 8, 0, 4, 3, 5, 7, 9];

  nums.sort();
  print(nums);

  var reversed = nums.reversed;
  print(reversed);
  print(nums);
}

我们有一个整数列表。它们被排序,然后反转。

nums.sort();

sort 方法会就地(in-place)排序整数。

var reversed = nums.reversed;

使用 reversed,我们得到一个按相反顺序排列的新列表。nums 中的值保持不变。

$ dart main.dart 
[0, 1, 2, 3, 4, 5, 7, 8, 9]
(9, 8, 7, 5, 4, 3, 2, 1, 0)
[0, 1, 2, 3, 4, 5, 7, 8, 9]

Dart 字符串列表排序

在下一个示例中,我们对字符串列表进行排序。

main.dart
void main() {
  var nums = <String>['sky', 'm', 'worm', 'cup', 'are', 'snail', 'water'];

  nums.sort();
  print(nums);

  var reversed = nums.reversed;
  print(reversed);

  print(nums);
}

默认情况下,字符串按字母顺序排序。

$ dart main.dart 
[are, cup, sky, snail, water, worm]
(worm, water, snail, sky, cup, are)
[are, cup, sky, snail, water, worm]

Dart 列表按长度排序字符串

以下示例按单词长度对单词列表进行排序。

main.dart
void main() {
  var words = <String>['falcon', 'order', 'war',
        'sky', 'ocean', 'blue', 'cloud', 'boy', 'by', 'raven',
        'station', 'batallion'];

  words.sort((e1, e2) => e1.length.compareTo(e2.length));
  words.forEach(print);

  words.sort((e1, e2) => e2.length.compareTo(e1.length));
  words.forEach(print);
}

我们提供了一个自定义比较方法来完成这项工作。

words.sort((e1, e2) => e1.length.compareTo(e2.length));

我们将一个匿名方法传递给 sort 方法。此方法使用整数类型的 compareTo 方法来比较两个值。单词的大小通过 length 属性返回。

$ dart main.dart 
by
war
sky
boy
blue
order
ocean
cloud
raven
falcon
station
batallion
batallion
station
falcon
order
ocean
cloud
raven
blue
war
sky
boy
by

Dart 对象列表排序

在下面的示例中,我们对 Employee 对象列表进行排序。

main.dart
class Employee {
  String fname;
  String lname;
  int salary;

  Employee(this.fname, this.lname, this.salary);

  @override
  String toString() {
    return "$fname $lname: $salary";
  }
}

void main() {
  var empls = <Employee>[
    new Employee("John", "Doe", 1230),
    new Employee("Adam", "Novak", 670),
    new Employee("Robin", "Brown", 2300),
    new Employee("Rowan", "Cruise", 990),
    new Employee("Joe", "Draker", 1190),
    new Employee("Janet", "Doe", 980),
    new Employee("Lucy", "Smith", 980),
    new Employee("Thomas", "Moore", 1400)
  ];

  empls.sort((e1, e2) => e1.lname.compareTo(e2.lname));
  empls.forEach(print);

  print("--------------------------");

  empls.sort((e1, e2) => e2.salary.compareTo(e1.salary));
  empls.forEach(print);
}

我们有一个 employee 对象列表。Employee 有三个属性:名字、姓氏和薪水。我们先按员工的姓氏,然后按他们的薪水对列表进行排序。

empls.sort((e1, e2) => e1.lname.compareTo(e2.lname));

员工按姓氏升序排序。

empls.sort((e1, e2) => e2.salary.compareTo(e1.salary));

员工按薪水降序排序。

$ dart main.dart 
Robin Brown: 2300
Rowan Cruise: 990
John Doe: 1230
Janet Doe: 980
Joe Draker: 1190
Thomas Moore: 1400
Adam Novak: 670
Lucy Smith: 980
--------------------------
Robin Brown: 2300
Thomas Moore: 1400
John Doe: 1230
Joe Draker: 1190
Rowan Cruise: 990
Janet Doe: 980
Lucy Smith: 980
Adam Novak: 670

Dart Comparable

如果对象可以自然排序,我们可以使用 Comparable 接口。

main.dart
class Employee implements Comparable<Employee> {
  String fname;
  String lname;
  int salary;

  Employee(this.fname, this.lname, this.salary);

  @override
  String toString() {
    return "$fname $lname: $salary";
  }
  
  @override
  int compareTo(Employee other) {
    return lname.compareTo(other.lname);
  }
}

void main() {
  var empls = <Employee>[
    new Employee("John", "Doe", 1230),
    new Employee("Adam", "Novak", 670),
    new Employee("Robin", "Brown", 2300),
    new Employee("Rowan", "Cruise", 990),
    new Employee("Joe", "Draker", 1190),
    new Employee("Janet", "Doe", 980),
    new Employee("Lucy", "Smith", 980),
    new Employee("Thomas", "Moore", 1400)
  ];

  empls.sort();
  empls.forEach(print);
}

在示例中,Employee 类实现了 Comparable 接口,以获得默认的自然排序。

@override
int compareTo(Employee other) {
    return lname.compareTo(other.lname);
}

我们实现了 compareTo 方法,该方法按姓氏对员工进行排序。

$ dart main.dart 
Robin Brown: 2300
Rowan Cruise: 990
John Doe: 1230
Janet Doe: 980
Joe Draker: 1190
Thomas Moore: 1400
Adam Novak: 670
Lucy Smith: 980

来源

Dart 列表排序方法 - 语言参考

在本文中,我们对 Dart 列表进行了排序。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程