如何在Dart中按多条件(年龄+姓名)对对象列表排序?
Dart实现多条件(age升序+name升序)列表排序
你的伪代码问题在于Comparable.compare返回的是整数(-1、0、1分别代表小于、等于、大于),而&&是布尔逻辑运算符,会把整数强制转为布尔值,这不符合sort回调要求返回整数的规则,所以不能这么写。
正确的思路是:先按age比较,如果age的比较结果不为0(说明两人年龄不同),直接返回这个结果;如果年龄相同(比较结果为0),再按name进行比较并返回结果。
修正后的代码
final personArray = [ _Person(age: 10, name: 'Dean'), _Person(age: 20, name: 'Jack'), _Person(age: 30, name: 'Ben'), _Person(age: 30, name: 'Alice'), ]; personArray.sort((p1, p2) { // 先比较年龄 final ageCompare = Comparable.compare(p1.age, p2.age); if (ageCompare != 0) { return ageCompare; } // 年龄相同时,比较姓名 return Comparable.compare(p1.name, p2.name); }); for (final element in personArray) { print(element.name); }
输出结果
Dean Jack Alice Ben
更简洁的写法(借助工具包)
如果觉得上面的写法繁琐,可以使用package:collection提供的链式排序工具(需要先在pubspec.yaml添加collection依赖):
import 'package:collection/collection.dart'; personArray.sort(compareBy((_Person p) => p.age).thenBy((_Person p) => p.name));
这种链式调用的写法更直观,能清晰体现排序条件的优先级。
内容的提问来源于stack exchange,提问作者无夜之星辰
相关产品推荐
相关产品推荐

