Scala Convert Set to Map - PullRequest
       1

Scala Convert Set to Map

19 голосов
/ 31 января 2011

Как преобразовать Набор ("a", "b", "c") в Карту ("a" -> 1, "b" -> 2, "c" -> 3)? Я думаю, что это должно работать с ToMap.

Ответы [ 4 ]

30 голосов
/ 31 января 2011

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 голосов
/ 25 апреля 2011

Вот еще одно решение, которое использует Stream всех натуральных чисел, начиная с 1, для архивирования с Set:

scala> Set("a", "b", "c") zip Stream.from(1) toMap
Map((a,1), (b,2), (c,3))
7 голосов
/ 31 января 2011

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
2 голосов
/ 12 июля 2012

Это также будет работать:

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