You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者无夜之星辰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:45:40