如何在Dart中依据Map列表对Collection模型列表重新排序?
按指定顺序排序Dart Collection列表
你手里有两个长度一致、handle完全匹配的列表,要让List<Collection>按照myOrder里的order值排序,下面是几种实用的实现方法:
方法一:先建handle-Order映射(高效首选)
先把myOrder转成一个键为handle、值为order的Map,这样排序时能直接拿到order值,避免重复遍历查找,整体效率是O(n log n),数据量大的时候优势明显。
代码示例:
// 生成handle到order的映射表 final handleOrderMap = { for (final entry in myOrder) entry['handle'] as String: entry['order'] as int }; // 对Collection列表原地排序 collectionList.sort((a, b) { return handleOrderMap[a.handle]!.compareTo(handleOrderMap[b.handle]!); });
方法二:直接按myOrder顺序重构新列表
要是不想原地修改原列表,想直接生成一个顺序完全匹配myOrder的新列表,可以遍历myOrder,逐个找到对应的Collection对象:
代码示例:
final sortedCollections = [ for (final orderItem in myOrder) collectionList.firstWhere((col) => col.handle == orderItem['handle']) ];
注意:这种方法在列表元素多的时候性能会下降,因为每次firstWhere都要遍历一遍collectionList,时间复杂度是O(n²),适合小数据量场景。
方法三:给Collection加扩展方法(代码更整洁)
如果需要多次做这类排序,可以给Collection类加个扩展方法,封装获取order的逻辑:
extension CollectionOrderExtension on Collection { int getOrder(List<Map<String, dynamic>> orderList) { return orderList.firstWhere((item) => item['handle'] == handle)['order'] as int; } } // 调用排序 collectionList.sort((a, b) => a.getOrder(myOrder).compareTo(b.getOrder(myOrder)));
这种写法可读性更好,但同样每次比较都会遍历orderList,性能不如方法一,适合对性能要求不高、更看重代码整洁的场景。
内容的提问来源于stack exchange,提问作者Santiago
相关产品推荐
相关产品推荐

