2012-03-15 69 views

回答

13
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)) 
+2

简单地说,我说。 :) – 2012-03-15 15:47:25

+0

哇,+1。没想到这个。 :) – missingfaktor 2012-03-15 15:48:13

2
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) 
+0

谢谢太。 @ sean-parsons的答案肯定是更好的可读性,但如果它更具内存/ CPU效率,我也会试着去尝试。很高兴知道。 – Ivan 2012-03-15 15:56:07

+2

它当然更昂贵。更多的对象创建和间接。肖恩建议的是更简洁和更高效的。 – missingfaktor 2012-03-15 16:07:06

+0

谢谢。无论如何,很高兴知道。 – Ivan 2012-03-15 17:06:47

6

我喜欢肖恩的答案,但如果你想要的,由于某种原因穿越地图只有一次,并没有想用Scalaz,这里是另一种解决方案:

a.foldLeft((Map.empty[String, Int], Map.empty[String, Int])) { 
    case ((a1, a2), (k, (v1, v2))) => (a1 + (k -> v1), a2 + (k -> v2)) 
} 
+0

你知道为什么有人低估了你的建议吗? – Ivan 2012-03-15 17:05:43

+0

@伊万不知道,真的。我有些不高兴吗? – romusz 2012-03-15 17:12:32

+0

我很好奇,可能这意味着有一个错误... – Ivan 2012-03-15 17:53:00