Scala将集合转换为映射

Scala将集合转换为映射,scala,scala-collections,Scala,Scala Collections,如何将集合(“a”、“b”、“c”)转换为映射(“a”->1,“b”->2,“c”->3)? 我认为它应该与toMap一起工作。toMap仅在集合项是键/值对(例如集合((“a”,1),(“b”,2),(“c”,3))时工作 要获得所需内容,请使用zipWithIndex: Set("a","b","c") zipWithIndex // Set[(String, Int)] = Set((a,0), (b,1), (c,2)) 或者(如你原来的问题): zipWithIndex可能就是您想要

如何将集合(“a”、“b”、“c”)转换为映射(“a”->1,“b”->2,“c”->3)?
我认为它应该与toMap一起工作。

toMap
仅在
集合
项是键/值对(例如
集合((“a”,1),(“b”,2),(“c”,3))
时工作

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

Set("a","b","c") zipWithIndex
// Set[(String, Int)] = Set((a,0), (b,1), (c,2))
或者(如你原来的问题):


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

一个额外的注意事项-集合不保留位置。如果您希望上述位置一致工作,请考虑使用类似结构的列表。

< p>这里是另一种解决方案,使用从1开始的所有自然数与您的<代码>集合>代码>:

scala> Set("a", "b", "c") zip Stream.from(1) toMap
Map((a,1), (b,2), (c,3))
这也将有助于:

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

你想让b映射到2,因为它是集合中的第二个吗?还是因为它是字母表中的第二个字母?正如其他海报所指出的那样,布景没有定购,所以第一套不起作用。
(('a' to 'c') zip (1 to 3)).toMap