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
相关产品推荐
相关产品推荐

