针对元组scala列表迭代现有映射

我有一个元组列表,我必须在包含这些元组的映射中更改值.所以,如果我有一个列表,如List((0,2),(0,3)),其地图如下所示:Map((0,2)=> List(1,2,3),( 0,3)=> List(1,2)),我需要使用列表中列出的元组访问匹配的映射元组,然后从映射中删除一个数字.

所以在上面的例子中,如果我想从映射中删除2,我会得到Map((0,2)=> List(1,3),(0,3)=> List(1)).

设计方面,我正在考虑匹配地图的模式,但我已经阅读了一些答案,说这可能不是最好的方法.对我来说困难的部分是它必须是不可变的,所以我想到模式匹配列表,获取地图值,更改值,然后重新创建地图并递归地再次调用该函数.你怎么看待这个实现?

最佳答案 这可能是一种从地图中删除2的方法:

val newMap = oldMap.mapValues(list => list.filter(_ != 2))

或者更一般地说:

def filterInMap(element: Int, oldMap: Map[(Int,Int),List[Int]]) = 
    oldMap.mapValues(list => list.filter(_ != element))

这样就没有必要改变任何东西了. mapValues仅转换Map的值并返回原始的副本而不会对其进行变更.过滤器然后通过仅允许与我们想要移除的元素不匹配的元素来完成工作.

额外奖励:更普遍:

def filterInMap[A](element: A, oldMap: Map[(A,A),List[A]]) = 
    oldMap.mapValues(list => list.filter(_ != element))
点赞