如何移除列表中存在键值交换情况的重复Map元素?
双向匹配重复元素的列表去重方案
核心思路
针对你的需求——两个元素只要coordinateId1和coordinateId2值互换就算重复,我们可以给每个元素生成一个与id顺序无关的唯一标识,通过这个标识来去重:
- 提取每个元素的
coordinateId1和coordinateId2,按字典序排序后拼接成字符串,作为该元素的唯一键 - 用集合存储已出现过的键,遍历列表时只保留首次出现的元素
代码实现(Dart)
void main() { List<Map> testList = [ {"coordinateId1": "smfs9f87enf3", "coordinateId2": "jsnd29829ne2"}, {"coordinateId1": "smfs9f87enf3", "coordinateId2": "dxs39xmr398m"}, {"coordinateId1": "jsnd29829ne2", "coordinateId2": "smfs9f87enf3"}, {"coordinateId1": "jsnd29829ne2", "coordinateId2": "dxs39xmr398m"}, {"coordinateId1": "dxs39xmr398m", "coordinateId2": "smfs9f87enf3"}, {"coordinateId1": "dxs39xmr398m", "coordinateId2": "jsnd29829ne2"} ]; final Set<String> seenKeys = {}; final List<Map> uniqueList = []; for (final item in testList) { // 生成与id顺序无关的唯一键 final id1 = item['coordinateId1'] as String; final id2 = item['coordinateId2'] as String; final sortedIds = [id1, id2]..sort(); final key = '${sortedIds[0]}|${sortedIds[1]}'; if (!seenKeys.contains(key)) { seenKeys.add(key); uniqueList.add(item); } } // 输出去重结果 print(uniqueList); }
原for循环出错的原因
直接遍历原列表并移除元素时,列表长度会动态变化,导致索引与元素的对应关系错乱:比如移除某元素后,后续元素会向前移位,下一次循环的索引会跳过移位后的元素,甚至触发数组越界的运行时错误。上面的方法通过新建列表存储结果,避免了遍历过程中修改原列表的问题。
内容的提问来源于stack exchange,提问作者Julis Araujo
相关产品推荐
相关产品推荐

