Scala将Set转换为Map

20

如何将集合 Set("a","b","c") 转换为映射 Map("a"->1,"b"->2,"c"->3)?我认为可以使用 toMap 方法实现。


3
你希望将b映射为2是因为它在Set中是第二个吗?还是因为它是字母表中的第二个字母?正如其他帖子中指出的那样,Set是无序的,所以第一个选项行不通。 - The Archetypal Paul
4个回答

31

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这样的数据结构。


19

这里有另一个解决方案,它使用从1开始的所有自然数的Stream与你的Set进行压缩:

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

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
这也可以起作用:
(('a' to 'c') zip (1 to 3)).toMap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接