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)
逻辑说明
- 将Map转为按键排序的Seq,保证处理顺序是0→1→2,对应元组首次出现的顺序;
- 用
foldLeft维护两个状态:seen记录已经出现过的元组,acc存储构建中的结果Map; - 对每个键对应的Vector,过滤出不在
seen中的元组,这些就是当前需要保留的内容; - 更新
seen集合,把当前保留的元组加入进去,再把过滤后的Vector存入结果Map; - 最终得到的
result就是符合要求的输出。
内容的提问来源于stack exchange,提问作者Hima_93
相关产品推荐
相关产品推荐

