2015-11-07 25 views
0

我有一个包含一个字符串和一个地图的Tuple2数组,我想为每个tuple2打印许多行作为地图的键数量。这是我写的:打印斯卡拉与地图元组数组

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' 

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

感谢, 安德烈

+0

你有什么功能......我不知道你可以得到“更多功能”的东西。 – marios

+0

@marios我的意思是功能是使用map()或flatMap()或类似的东西。 –

回答

1

我觉得OP是寻找使用mapflatMap的解决方案(而不是为-内涵的语法糖)。

这是一个尝试做到这一点。首先将(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'") } 
+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

到您的解决方案类似与foreach

a foreach { t => 
    t._2 foreach { m => 
     println("value [" + t._1 + "] for [" + m._1 + "] is '" + m._2 + "'") 
    } 
}