【问题标题】:How to change keys from a map in scala如何从scala中的地图更改键
【发布时间】:2022-01-11 00:23:18
【问题描述】:

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

HashMap(false -> List(20, 15, 20, 17), true -> List(50, 25, 45, 21, 100, 2000, 2100))

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

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

【问题讨论】:

    标签: java scala functional-programming purely-functional


    【解决方案1】:

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

    yourMap.map({ case (a, b) => (f(a), b) })
    

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

    Map(false -> "String1", true -> "String2")
    

    把它们放在一起:

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

    产生预期的结果:

    Map(String1 -> List(20, 15, 20, 17), String2 -> List(50, 25, 45, 21, 100, 2000, 2100))
    

    如果你喜欢单行,你也可以避免使用单独的地图/功能:

    yourMap.map({
      x => x match {
        case (false, v) => ("String1", v)
        case (true, v)  => ("String2", v)
      }
    })
    

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

    yourMap.map({case (a, b) =>
      (a match {
         case false => "String1"
         case true  => "String2"}, b)})
    

    为了完整起见,如果你唯一的元素真的是 truefalse 你可以这样做:

    yourMap.map({case (a, b) => (if (a) "String2" else "String1", b)})
    

    【讨论】:

      【解决方案2】:

      使用pattern matching anonymous function directly

      hashM
        .map {
          case (true, ints) => "String1" -> ints
          case (false, ints) => "String2" -> ints
        }
      

      如果您使用非详尽的模式匹配,即您还想从集合中安全地过滤掉一些元组,请使用collect

      hashM  
        .collect {
          case (true, ints) => "String1" -> ints
        }
      

      你会到达这里:

      Map(String1 -> List(50, 25, 45, 21, 100, 2000, 2100))
      

      这可能是我能想到的最易读的解决方案了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 2017-04-21
        • 2020-09-24
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多