如何从scala中的地图更改键

Posted

技术标签:

【中文标题】如何从scala中的地图更改键【英文标题】:How to change keys from a map in 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 并且能够将键更改为相同的字符串,但不能更改为不同的字符串。

【问题讨论】:

【参考方案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))

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

【讨论】:

以上是关于如何从scala中的地图更改键的主要内容,如果未能解决你的问题,请参考以下文章

如何从scala中的地图中删除键值

如何更改pyspark中的并行任务数

如何从 Scala 中的映射键中获取值的常见元素?

如何更改 React 地图中的渲染顺序

Flutter 流构建器概念

在本地文件系统(不是HDFS)中使用Scala读取Apache Spark中的文件时如何更改输入块大小[重复]