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

Scala:如何在Map中仅保留首次出现的元组并移除冗余(不使用diff)

移除Map中Vector元组的重复项(保留首次出现)

输入示例

val inputVal = Map(
  0 -> Vector(("a", (0,1)),("b",(0,2)),("a",(2,3)),("c",(1,1))),
  1 -> Vector(("a", (0,1)),("b",(0,2)),("d",(3,3)),("d",(4,3))),
  2 -> Vector(("d",(3,3)),("e",(1,3)))
)

需求说明

处理上述Map,仅保留每个元组在所有Vector中的首次出现,后续在其他Vector里出现的重复元组全部移除。

期望输出

val output = Map(
  0 -> Vector(("a", (0,1)),("b",(0,2)),("a",(2,3)),("c",(1,1))),
  1 -> Vector(("d",(3,3)),("d",(4,3))),
  2 -> Vector(("e",(1,3)))
)

不依赖diff()的解决方案

可以通过foldLeft跟踪已出现的元组集合,逐步构建结果Map:

// 按Map的键顺序遍历,确保首次出现的顺序正确
val (_, result) = inputVal.toSeq.sortBy(_._1).foldLeft((Set.empty[(String, (Int, Int))], Map.empty[Int, Vector[(String, (Int, Int))]])) {
  case ((seen, acc), (key, vec)) =>
    // 过滤当前Vector中未出现过的元组
    val filteredVec = vec.filterNot(seen.contains)
    // 更新已出现的元组集合
    val updatedSeen = seen ++ filteredVec
    // 更新结果Map
    val updatedAcc = acc + (key -> filteredVec)
    (updatedSeen, updatedAcc)
}

// 验证结果
println(result)

逻辑说明

  1. 将Map转为按键排序的Seq,保证处理顺序是0→1→2,对应元组首次出现的顺序;
  2. 用foldLeft维护两个状态:seen记录已经出现过的元组,acc存储构建中的结果Map;
  3. 对每个键对应的Vector,过滤出不在seen中的元组,这些就是当前需要保留的内容;
  4. 更新seen集合,把当前保留的元组加入进去,再把过滤后的Vector存入结果Map;
  5. 最终得到的result就是符合要求的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:40:00