Scala转换设置为地图

时间:2011-01-31 13:33:37

标签: scala scala-collections

如何将Set(“a”,“b”,“c”)转换为Map(“a” - > 1,“b” - > 2,“c” - > 3) ? 我认为它应该适用于toMap。

4 个答案:

答案 0 :(得分:30)

zipWithIndex可能就是你要找的东西。它将收集您的字母并创建一个新的元组集合,将值与集合中的位置相匹配。你有一个额外的要求 - 看起来你的位置从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之类的结构。

答案 1 :(得分:19)

以下是另一种解决方案,该解决方案使用从{1开始压缩的所有自然数的StreamSet压缩:

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

答案 2 :(得分:7)

仅当toMap条目是键/值对(例如Set)时,

Set(("a",1),("b",2),("c",3))才有效。

要获得所需内容,请使用zipWithIndex

Set("a","b","c") zipWithIndex
// Set[(String, Int)] = Set((a,0), (b,1), (c,2))

或(如原始问题中所述):

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

答案 3 :(得分:2)

这也有效:

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