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

