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

时间:2016-04-01 13:45:26

标签: list scala dictionary

我有一个元组列表,我必须在包含这些元组的映射中更改值。因此,如果我有一个像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))

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

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))