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

如何移除列表中存在键值交换情况的重复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:12:31