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

Dart中如何将类实例列表与数值列表同步排序?

在Dart中同步排序两个关联列表

要实现列表b升序排序同时同步调整列表a的顺序,核心思路是先将两个列表的元素一一配对,基于b的数值排序后再拆分回原列表结构。下面是具体的实现步骤和代码示例:

步骤说明

  • 第一步:将列表a和b的元素按索引配对,确保每个自定义类实例对应正确的数值
  • 第二步:以配对中的数值为依据进行升序排序
  • 第三步:将排序后的配对列表重新拆分为新的a和b列表

代码示例

假设你的自定义类是Something,先定义这个类(方便演示):

class Something {
  final String name;
  Something(this.name);
  
  @override
  String toString() => 'Instance of Something(name: $name)';
}

接下来是同步排序的核心代码:

void main() {
  // 初始化示例列表
  List<Something> a = [
    Something('A'),
    Something('B'),
    Something('C'),
  ];
  List<int> b = [165, 75, 123];

  // 1. 检查两个列表长度是否一致(避免索引越界)
  if (a.length != b.length) {
    throw ArgumentError('列表a和b的长度必须相同');
  }

  // 2. 将a和b的元素配对成新列表,使用Dart 3.0+的记录类型(也可以用Map)
  List<(Something, int)> pairedList = [];
  for (int i = 0; i < a.length; i++) {
    pairedList.add((a[i], b[i]));
  }

  // 3. 基于数值升序排序配对列表
  pairedList.sort((pair1, pair2) => pair1.$2.compareTo(pair2.$2));

  // 4. 拆分排序后的配对列表,得到同步后的a和b
  List<Something> sortedA = pairedList.map((pair) => pair.$1).toList();
  List<int> sortedB = pairedList.map((pair) => pair.$2).toList();

  // 打印结果验证
  print('排序后的a: $sortedA');
  print('排序后的b: $sortedB');
}

运行结果

排序后的a: [Instance of Something(name: B), Instance of Something(name: C), Instance of Something(name: A)]
排序后的b: [75, 123, 165]

补充说明

  • 如果你使用的是Dart 3.0以下版本,不支持记录类型,可以用Map<String, dynamic>来存储配对:
    List<Map<String, dynamic>> pairedList = [];
    for (int i = 0; i < a.length; i++) {
      pairedList.add({'item': a[i], 'value': b[i]});
    }
    // 排序时:
    pairedList.sort((map1, map2) => map1['value'].compareTo(map2['value']));
    // 拆分时:
    List<Something> sortedA = pairedList.map((map) => map['item'] as Something).toList();
    List<int> sortedB = pairedList.map((map) => map['value'] as int).toList();
    
  • 一定要确保两个列表的长度相同,否则会出现配对错误或者索引越界问题。

内容的提问来源于stack exchange,提问作者Zisei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:28:11