2011-01-31 25 views
19

如何将一个Set(“a”,“b”,“c”)转换为Map(“a” - > 1,“b” - > 2,“c” - > 3)? 我认为它应该与toMap一起工作。斯卡拉转换器设置为地图

+2

你希望B映射到2,因为这是集合中的第二个?或者因为它是字母表中的第二个字母?正如其他海报所指出的那样,套件并没有订购,所以第一套将无法使用。 – 2011-01-31 14:54:46

回答

30

zipWithIndex可能是你在找什么。它将收集您的信件并创建一个新的Tuples集合,将价值与集合中的位置相匹配。你虽然有一个额外的要求 - 它看起来像你的仓位从1开始,而不是0,所以你需要改变这些元组:

Set("a","b","c") 
    .zipWithIndex //(a,0), (b,1), (c,2) 
    .map{case(v,i) => (v, i+1)} //increment each of those indexes 
    .toMap //toMap does work for a collection of Tuples 

一个额外的考虑 - 设置不保留位置。考虑使用像List这样的结构,如果你想让上述位置一致地工作。

+0

这就是我想要的。谢谢。 – 2011-01-31 14:26:03

7

toMap只有在Set实体是键/值对(例如Set((“a”,1),(“b”,2),(“c”,3))))时才有效。 为了得到你想要的东西,用zipWithIndex:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

编辑: 或(在你原来的问题:))

scala> Set("a","b","c") zip (1 to 3) toMap 

EDIT2:咄,我忘了toMap底!

19

下面是与您的Set被拉链使用从1开始的所有自然数的Stream另一种解决方案:

scala> Set("a", "b", "c") zip Stream.from(1) toMap 
Map((a,1), (b,2), (c,3)) 
+0

+1,这里是最好的答案。 – missingfaktor 2012-02-04 09:01:44

2

这也将工作:

(('a' to 'c') zip (1 to 3)).toMap