2012-03-15 54 views
0

如何将Maped集合中的IndexedSeq映射到Scala中不同类型的集合?

val a: IndexedSeq[String] = Array("one", "two", "three") 

def f(s: String): Int = s match { 
    case "one" => 1; case "two" => 2; case "three" => 3; 
    case _ => throw new IllegalArgumentException 
} 

我最好如何获得

val m: Map[String, Int] = Map("one" -> 1, "two" -> 2, "three" -> 3) 

假设我不介意引入代理功能返回键 - 值对元组,如果这将使一个更好的解决方案。 PS:我实际上对如何将一个集合映射到不同所需类型的集合感兴趣,但是选择了这个例子作为特例来说明和提出更具体的问题。这意味着特定的案例(IndexedSeq到Map)解决方案是可以接受的,但更多的通用评论是受欢迎的。现在我使用foreach填充这种情况下的可变映射缓冲区,但是这似乎与真正的Scala功能方式相差太远。我发现自己使用了太多的foreach和可变缓冲区,这让我感到紧张,这就是为什么我会问所有关于映射的问题。

回答

2

这是更有效,但更复杂的充分理解。这避免了由map创建的中间IndexedSeq[(String, Int)]。只是觉得好玩;-)

val result: Map[String, Int] = a.map(i => (i, f(i)))(scala.collection.breakOut) 

看到这个职位的SO:Scala 2.8 breakOut

+0

这很奇怪:如果我没有明确指定'val result'类型,它会得到'IndexedSeq [(String,Int)]',但如果我这样做 - 它会按需要工作。我将研究关于bereakOut,谢谢你链接到这个问题。 – Ivan 2012-03-15 23:42:28

5

的,什么是错:

a map {i => (i, f(i))} toMap 

生产:

scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2, three -> 3) 
+0

看起来没什么,我只是做了一点错误。谢谢。 – Ivan 2012-03-15 22:56:03