Scala 从 Map 中的数组获取数组

Scala get Array from array in Map

我是 scala 的新手,有地图:(是这样,因为我从 mongo 得到了像这样的巨大地图)

val test = Map(
      "temp" -> Array( 1,
        Array(
          1, "kisa"
        )
      )
    )

我怎样才能得到 "kisa"?

所以...让我解释一下,

val test = Map(
  "temp" -> Array( 1,
    Array(
      1, "kisa"
    )
  )
)

现在 testscala.collection.immutable.Map[ String, Array[ Any ] ] 这意味着 mapStringArray[ Any ].

所以...要获取与键关联的值 - "temp",您需要

val tempVal = test( "temp" )

现在,tempVal 的类型是 Array[ Any ],它的值是 Array( 1, Array( 1, kisa ) )

我们想要的是此数组中的第二个(索引 = 1)条目。

val secondEntry = tempVal( 1 )

现在... secondEntry 的类型为 Any 并且其值为 Array( 1, Kisa )... 我们现在无法获得 Kisa... 首先我们必须将其从 Any 转换为 Array[ Any ].

val secondEntryArray = secondEntry.asInstanceOf[ Array[ Any ] ]

现在...secondEntryArrayArray[ Any ] 类型,其值为 Array( 1, kisa )

现在,我们必须从这个数组中获取第二个条目,

val kisaVal = secondEntryArray( 1 )

现在...kisaVal 的类型为 Any,其值为 kisa。你知道它是一个 String 并且你可能希望它是一个 String... 所以让我们将它类型转换为一个字符串,

val kisaString = kisaVal.asInstanceOf[ String ]

大功告成。

只需一行即可完成....

val kisa = test( "temp" )( 1 ).asInstanceOf[ Array[ Any ] ]( 1 ).asInstanceOf[ String ]

模式匹配优于asInstanceOf:

test("temp") match {
  case Array(_, Array(_, s: String)) =>
    s
}

瞧。

如果你想将结果绑定到一个变量,而不是仅仅返回它,你甚至可以将它缩短为:

val Array(_, Array(_, s: String)) = test("temp")

Scala REPL 响应:

s: String = kisa