我有一个元组列表,我必须在包含这些元组的映射中更改值。因此,如果我有一个像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))
。
设计明智,我正在考虑匹配地图的模式,但我已经阅读了一些答案,说这可能不是最好的方式。对我来说困难的部分是它必须是不可变的,所以我想到模式匹配列表,获取地图值,更改值,然后重新创建地图并递归地再次调用该函数。您如何看待这种实施?
答案 0 :(得分:2)
这可以从您的2
中删除Map
:
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
的值,并返回原始副本,而不会对其进行变更。 filter
然后通过仅允许与我们想要移除的元素不匹配的元素来完成工作。
奖金:更普遍:
def filterInMap[A](element: A, oldMap: Map[(A,A),List[A]]) =
oldMap.mapValues(list => list.filter(_ != element))