2015-11-07 2 views
0

У меня есть массив Tuple2, который содержит строку и карту, и я бы хотел напечатать для каждого tuple2 столько строк, сколько количество ключей на карте. Это то, что я писал:print scala массив кортежей с картой

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' 

Результат является правильным, но есть более краткий (и функциональный) способ получения этого результата?

Спасибо, Andrea

+0

У вас есть функциональный ... Я не уверен, что вы можете получить что-то более функциональное. – marios

+0

@marios, что я имел в виду с функциональностью, использует map() или flatMap() или что-то подобное .. –

ответ

1

Я думаю, что ОП ищет решение с использованием map и flatMap (вместо синтаксического сахара для-постижений).

Вот одна попытка сделать это. Сначала вы разложите пару (ключ, карта) на кортеж (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 + "'") 
    } 
} 
Смежные вопросы