Maps 的 Scala 访问顺序

Scala access sequence of Maps

提问人:princess of persia 提问时间:2/24/2013 最后编辑:kiritsukuprincess of persia 更新时间:2/24/2013 访问量:279

问:

我有一个,我想提取键是“文本”的值,我想把它放在一个.我写了以下文章,但它不起作用:IndexedSeq[Map[String, String]]val text:IndexedSeq[String]

val text:IndexedSeq[String] = _
for(j <- 0 to indSeq.length-1){
  text(j) = indSeq(j).get("text")
}
列出 Scala 字典 序列

评论


答:

1赞 Ben James 2/24/2013 #1

您可能看到编译器错误,因为返回的是 ,而不是 .indSeq(j).get("text")Option[String]String

如果只想获取序列中键的所有值,请使用:"text"

val text = indSeq flatMap (_ get "text")

如果两个序列的索引对齐很重要,则需要替换默认值,以防键不存在:"text"

val text = indSeq map (_.getOrElse("text", "default"))

评论

0赞 princess of persia 2/24/2013
我正在使整个地图展平,而不仅仅是具有键“文本”的值。所以我正在寻找“文本”->“Lorem ipsum”,我想要一个“Lorem ipsum”序列。我相信每张地图都有一个关键的“文本”
0赞 Dave L. 2/24/2013 #2

由于您最初尝试使用理解,因此您可能也有兴趣以这种方式进行:

val text = (for { m <- indSeq } yield m get "text") flatten

编辑

或者,如果您想要默认值,您可以执行以下操作:

val text = for { m <- indSeq } yield m getOrElse("text", "default")

评论

0赞 Chirlo 2/24/2013
这将摆脱原始索引,我知道他有兴趣保留
0赞 Chirlo 2/24/2013 #3

我认为最好的方法是与守卫一起理解,以摆脱没有该元素的地图:"text"

val result = for {
  i <- 0 until indexSeq.length
  map = indexSeq(i)
  if map isDefinedAt ("text")
} yield { (i, map("text")) }

val seq = result.toIndexedSeq

这样,您就可以将原始索引保留在地图中。它还避免持有任何价值,这始终是一种好处var