Dart 列表排序
最后修改日期:2024 年 1 月 28 日
在本文中,我们将展示如何在 Dart 语言中对列表元素进行排序。
排序
排序是将元素按有序序列排列。过去,人们开发了多种算法来执行数据排序,包括归并排序、快速排序、选择排序或冒泡排序。
洗牌(shuffling),与排序相反,是将元素序列重新排列成随机或无序的顺序。
数据可以按字母顺序或数字顺序进行排序。排序键指定了用于执行排序的标准。可以按多个键对对象进行排序。例如,在对用户进行排序时,用户姓名可用作主要排序键,他们的职业可用作次要排序键。
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 字符串列表排序
在下一个示例中,我们对字符串列表进行排序。
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 列表按长度排序字符串
以下示例按单词长度对单词列表进行排序。
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 对象列表进行排序。
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 接口。
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 教程。