如何在 scala 中更改地图中的键

Max*_*ger 1 java functional-programming scala purely-functional

如何在没有任何变量的情况下从地图上更改以下键全功能

HashMap(false -> List(20, 15, 20, 17), true -> List(50, 25, 45, 21, 100, 2000, 2100))
Run Code Online (Sandbox Code Playgroud)

HashMap("String1" -> List(20, 15, 20, 17), "String2" -> List(50, 25, 45, 21, 100, 2000, 2100))
Run Code Online (Sandbox Code Playgroud)

我尝试使用地图,并且能够将键更改为相同的字符串,但不能更改为不同的字符串。

rud*_*vic 5

您可以将地图应用于所有项目,但仅关注键:

yourMap.map({ case (a, b) => (f(a), b) })
Run Code Online (Sandbox Code Playgroud)

您可以定义f为函数或简单的常量映射,例如:

Map(false -> "String1", true -> "String2")
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

object HelloWorld {
   def main(args: Array[String]) {
        val m = Map(false -> List(20, 15, 20, 17), true -> List(50, 25, 45, 21, 100, 2000, 2100))
        val f = Map(false -> "String1", true -> "String2")
        val x = m.map({ case (a, b) => (f(a), b) })
        System.out.println(x)
   }
}
Run Code Online (Sandbox Code Playgroud)

产生预期结果:

Map(String1 -> List(20, 15, 20, 17), String2 -> List(50, 25, 45, 21, 100, 2000, 2100))
Run Code Online (Sandbox Code Playgroud)

如果你喜欢单行,你也可以避免单独的映射/函数:

Map(String1 -> List(20, 15, 20, 17), String2 -> List(50, 25, 45, 21, 100, 2000, 2100))
Run Code Online (Sandbox Code Playgroud)

另一种方法是只处理元组的左侧:

yourMap.map({
  x => x match {
    case (false, v) => ("String1", v)
    case (true, v)  => ("String2", v)
  }
})
Run Code Online (Sandbox Code Playgroud)

为了完整起见,如果您唯一的元素确实是true并且false您可以这样做:

yourMap.map({case (a, b) =>
  (a match {
     case false => "String1"
     case true  => "String2"}, b)})
Run Code Online (Sandbox Code Playgroud)