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

Dart如何基于指定值列表对Map类型元素组成的List进行排序

Dart自定义排序实现方案

完整实现代码

void main() {
  final data = [
    {'id': 1},
    {'id': 10},
    {'id': 2},
    {'id': 1},
    {'id': 10},
    {'id': 1000},
  ];

  List<int> sortingList = [1000, 1, 6, 99];

  // 构建id到排序优先级的映射,提升查询效率
  final priorityMap = <int, int>{};
  for (int i = 0; i < sortingList.length; i++) {
    priorityMap[sortingList[i]] = i;
  }

  // 自定义排序逻辑
  data.sort((a, b) {
    final aId = a['id'] as int;
    final bId = b['id'] as int;
    // 不在排序列表中的id统一设置最低优先级,排在末尾
    final aPriority = priorityMap[aId] ?? sortingList.length;
    final bPriority = priorityMap[bId] ?? sortingList.length;
    return aPriority.compareTo(bPriority);
  });

  // 验证输出
  for (var element in data) {
    print(element['id']);
  }
}

逻辑说明

  • 提前构建优先级映射:将sortingList中的id和它的索引一一对应,索引越小代表排序优先级越高。相比排序时每次调用indexOf遍历查找,这种方式查询效率为O(1),数据量大时性能优势更明显
  • 排序规则:
    • 取出两个比较元素的id,分别查询优先级映射表
    • 如果id不在映射表中,统一将优先级设为sortingList的长度,该值比所有存在于sortingList的id的索引都大,因此不在参考列表的元素会全部排在列表末尾
    • 按照优先级从小到大排序即可,优先级相同的元素会保持原有相对顺序,符合需求的输出要求

输出结果

1000
1
1
10
2
10

如果你需要对排在末尾的元素额外按照id大小排序,只需要在优先级相同的情况下增加id的比较逻辑:

data.sort((a, b) {
  final aId = a['id'] as int;
  final bId = b['id'] as int;
  final aPriority = priorityMap[aId] ?? sortingList.length;
  final bPriority = priorityMap[bId] ?? sortingList.length;
  if (aPriority != bPriority) {
    return aPriority.compareTo(bPriority);
  }
  // 优先级相同(同id/都不在参考列表)时按id升序排列
  return aId.compareTo(bId);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:54:01