用地图打印scala数组的元组

时间:2015-11-07 16:54:37

标签: scala functional-programming

我有一个包含字符串和地图的Tuple2数组,我想为每个元组2打印与地图键数一样多的行。这就是我写的:

val a = Array(
           ("foo", HashMap(1->"f1", 2->"f2")),
           ("bar", HashMap(1->"b1", 2->"b2"))
        )

for (sourceNode <- a) {
   for (destNode <- sourceNode._2) {
     println("value [" + sourceNode._1 + "] for [" + destNode._1 + "] is '" + destNode._2 + "'")
   }
 }

以下是结果:

value [foo] for [1] is 'f1'
value [foo] for [2] is 'f2'
value [bar] for [1] is 'b1'
value [bar] for [2] is 'b2'

结果是正确的,但是有更简洁(和功能)的方法来获得这个结果吗?

谢谢, 安德烈

3 个答案:

答案 0 :(得分:1)

你可以这样做

for ((name, map) <- a) {
  for ((key, value) <- map) {
    println("value [" + name + "] for [" + key + "] is '" + value + "'")
  }
}

但你可以使它更简洁

for {
  (name, map) <- a
  (key, value) <- map
} println(s"value [$name] for [$key] is '$value'")

以下是有关理解的更多信息 http://docs.scala-lang.org/tutorials/tour/sequence-comprehensions.html

答案 1 :(得分:1)

与使用foreach

的解决方案类似
a foreach { t => 
    t._2 foreach { m =>
      println("value [" + t._1 + "] for [" + m._1 + "] is '" + m._2 + "'")
    }
}

答案 2 :(得分:1)

我认为OP正在寻找使用mapflatMap的解决方案(而不是for-comprehensions的语法糖)。

这是尝试这样做的一种尝试。首先,您将(key,Map)对分解为(key1,key2,value)元组,然后您只需提供一个打印方法。这是代码:

val a = Array(
           ("foo", Map(1->"f1", 2->"f2")),
           ("bar", Map(1->"b1", 2->"b2"))
        )

a.flatMap{
   case(k,theMap) => theMap.map(e => (k,e._1,e._2))
}.foreach{ case(k1,k2,v) => println(s"value [$k1] for [$k2] is '$v'") }