Как отобразить карту кортежей в кортеж карт в Scala? - PullRequest
4 голосов
/ 15 марта 2012

Имея

val a: Map[String, (Int, Int)] = Map("a" -> (1, 10), "b" -> (2, 20))

, какой будет правильный способ Scala для получения

val b: (Map[String, Int], Map[String, Int]) = (Map("a" -> 1, "b" -> 2), Map("a" -> 10, "b" -> 20))

из a?

Ответы [ 3 ]

13 голосов
/ 15 марта 2012
scala> val b = (a.mapValues(_._1), a.mapValues(_._2))
b: (scala.collection.immutable.Map[String,Int], scala.collection.immutable.Map[String,Int]) = (Map(a -> 1, b -> 2),Map(a -> 10, b -> 20))
6 голосов
/ 15 марта 2012

Мне нравится ответ Шона, но если вы захотите, по какой-то причине пересечь вашу карту только один раз и не хотите использовать Scalaz, вот другое решение:

a.foldLeft((Map.empty[String, Int], Map.empty[String, Int])) {
  case ((a1, a2), (k, (v1, v2))) => (a1 + (k -> v1), a2 + (k -> v2))
}
2 голосов
/ 15 марта 2012
import scalaz._
import Scalaz._

scala> val m = Map("a" -> (1, 10), "b" -> (2, 20))
m: scala.collection.immutable.Map[java.lang.String,(Int, Int)] = Map(a -> (1,10), b -> (2,20))

scala> val (a, b) = m.toSeq foldMap { case (k, (v1, v2)) => (Map(k -> v1), Map(k -> v2)) }
a: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 2, a -> 1)
b: scala.collection.immutable.Map[java.lang.String,Int] = Map(b -> 20, a -> 10)
...