Scala:转换嵌套集合的惯用语法是什么?

时间:2010-07-09 17:37:53

标签: scala

例如:我有一个地图列表,我想根据地图的第3个“列”的值创建一个列表...

val l = List(Map(1 -> "test", 2 -> "test", 3 -> "test"), Map(4 -> "test", 5 -> "test", 6 -> "test"))

2 个答案:

答案 0 :(得分:6)

嗯,地图上没有排序,所以问题的“第三列”部分没有意义。如果您的意思是“返回包含地图键3的值列表”,那么您可以这样做

    val l = List(Map(1 -> "test1", 2 -> "test2", 3 -> "test3"), Map(1 -> "test4", 2 -> "test5", 3 -> "test6"))

    val thirdArgs= for(map<-l; value <-map.get(3)) yield value
   // or equivalently val thirdArgs= l.flatMap(_.get(3))

    println(thirdArgs)// prints List(test3, test6)

这取决于map.get(3)返回Option [String]的事实,而Scala for-comprehension语法与Option一起使用。

如果您的确意味着“第三列”,那么您想要的数据结构不是地图,而是元组。

val l = List(("test1","test2","test3"), ("test4","test5", "test6"))

val thirdArgs= for(tuple<-l) yield tuple._3
// or equivalently val thirdArgs= l.map(_._3)
println(thirdArgs)// prints List(test3, test6)

答案 1 :(得分:6)

Kim,我们需要几乎无限量的“握住我的手”简单的Scala解决方案发布在网络上,因此初级程序员可以谷歌并开始运行。我们走了:

也许这就是你想要的:

 scala> val l = List(Map(1 -> "test1", 2 -> "test2", 3 -> "test3"), 

    | Map(1 -> "test4", 2 -> "test5", 3 -> "test6"))

>l: List[scala.collection.immutable.Map[Int,java.lang.String]] = List(Map(1 -> test1, 2 -> test2, 3 -> test3), Map(1 -> test4, 2 -> test5, 3 -> test6))

你可以得到第三个“行”:

scala> l.map( numMap => numMap(3))

res1: List[java.lang.String] = List(test3, test6)