Scala Convert Set to Map

眉间皱痕 提交于 2020-08-02 06:09:10

问题


How do I convert a Set("a","b","c") to a Map("a"->1,"b"->2,"c"->3)? I think it should work with toMap.


回答1:


zipWithIndex is probably what you are looking for. It will take your collection of letters and make a new collection of Tuples, matching value with position in the collection. You have an extra requirement though - it looks like your positions start with 1, rather than 0, so you'll need to transform those Tuples:

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

One extra consideration - Sets don't preserve position. Consider using a structure like List if you want the above position to consistently work.




回答2:


Here is another solution that uses a Stream of all natural numbers beginning from 1 to be zipped with your Set:

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



回答3:


toMap only works if the Set entries are key/value pairs (e.g. Set(("a",1),("b",2),("c",3))).

To get what you want, use zipWithIndex:

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

or (as in you original question):

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



回答4:


This would also work:

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


来源:https://stackoverflow.com/questions/4851418/scala-convert-set-to-map

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!