【问题标题】:Get value of nested maps in Scala在 Scala 中获取嵌套映射的值
【发布时间】:2015-03-11 22:15:56
【问题描述】:

我有一个结构如下的地图:

Map[String, Map[String, String]]

有没有一种优雅的方式来获取内部地图的价值?

【问题讨论】:

    标签: scala dictionary nested


    【解决方案1】:

    只需按正常方式进行...两次。

    val m = Map("a" -> Map("b" -> "c"))
    m("a")("b")  // c
    

    第一个操作m("a") 返回内部Map[String,String]。第二个操作that("b") 返回返回的 Map 中的字符串。

    同理:

    val m = Map("a" -> Map("b" -> "c"))
    val m2 = m("a")  // Map(b -> c)
    m2("b")          // c
    

    另一方面,如果您认为它们的键可能不存在,那么请执行以下操作:

    for {
      x <- m.get("a")   // x = Map(b -> c)
      y <- x.get("b")   // y = c
    } yield y
    // Some(c)
    
    for {
      x <- m.get("a")   // x = Map(b -> c)
      y <- x.get("d")   // fails
    } yield y
    // None
    
    for {
      x <- m.get("c")   // fails
      y <- x.get("d")   // doesn't run
    } yield y
    // None
    

    对于您的示例,key2 是 Option,就像 m.get(key1),因此您可以以相同的方式处理它:

    val key1: String = "a"
    val key2: Option[String] = Some("b")
    for { 
      value1 <- m.get(key1)
      k2 <- key2
      value2 <- value1.get(k2) 
    } yield value2
    // Some(c)
    

    【讨论】:

    • 感谢您的回答。在“for”部分,假设我需要从定义为 Option[String] 的 var 中获取第二个映射的值(示例中使用了“b”)。有没有一种简洁的方法?
    • Some(1).flatMap(Map(1 -> 2).get) - Some(1) 是您的查找键
    • 对不起,我没听懂...这是我的代码: def getValue(key1: String, key2: Option[String]): Option[String] = { for { value1
    • 感谢@dhg 很棒!
    • 我必须使用DerivedFeaturesLocations("outer_key").asInstanceOf[Map[String, String]]("inner_key")。这是为什么呢?
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2019-12-06
    • 2021-08-05
    • 2012-04-27
    相关资源
    最近更新 更多