【问题标题】:Iterate over an existing map against a list of tuples scala针对元组列表迭代现有地图
【发布时间】:2016-04-01 13:45:25
【问题描述】:

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

设计明智,我正在考虑模式匹配地图,但我读过一些答案说这可能不是最好的方法。对我来说困难的部分是它必须是不可变的,所以我正在考虑模式匹配列表,获取映射值,更改值,然后重新创建映射并再次递归调用函数。你觉得这个实现怎么样?

【问题讨论】:

    标签: list scala dictionary


    【解决方案1】:

    这可能是一种从您的Map 中删除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 的值并返回原件的副本而根本不改变它。 filter 然后通过只允许与我们要删除的元素不匹配的元素来完成工作。

    奖励:更一般地说:

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

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多