Scala访问映射序列

时间:2013-02-23 17:26:56

标签: list scala map sequence

我有一个IndexedSeq[Map[String, String]],我想在key为“text”的地方提取值,我想把它放在val text:IndexedSeq[String]中。我写了下面这篇文章,但它不起作用:

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

3 个答案:

答案 0 :(得分:1)

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

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

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

如果两个序列的索引排成一行很重要,那么在密钥"text"不存在的情况下,您将需要替换默认值:

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

答案 1 :(得分:0)

由于您最初尝试使用for-comprehension,您可能也有兴趣这样做:

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

修改

或者如果你想要一个默认值,你可以这样做:

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

答案 2 :(得分:0)

我认为最好的方法是通过一个警卫来理解摆脱没有"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值,这始终是一个额外的