2011-01-31 11 views
19

Cómo convertir un conjunto ("a", "b", "c") a un mapa ("a" -> 1, "b" -> 2, "c" -> 3)? Creo que debería funcionar con toMap.Scala Convert Establecer como mapa

+2

¿Quieres b para mapear a 2 porque es el segundo en el Set? ¿O porque es la segunda letra del alfabeto? Los conjuntos no están ordenados, como han señalado otros carteles, por lo que el primero no funcionará. –

Respuesta

30

zipWithIndex es probablemente lo que está buscando. Tomará su colección de letras y creará una nueva colección de Tuplas, haciendo coincidir el valor con la posición en la colección. Usted tiene un requisito adicional de que - se ve como sus posiciones comienzan con 1, en lugar de 0, por lo que necesita para transformar esas tuplas:

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 

Una consideración adicional - Conjuntos no conservan su posición. Considere usar una estructura como Lista si desea que la posición anterior funcione de manera consistente.

+0

Eso es lo que quería. Gracias. –

7

toMap solo funciona si el conjunto es pares de clave/valor (por ejemplo, Set (("a", 1), ("b", 2) ("c", 3)). Para obtener lo que desea, utilice zipWithIndex:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

EDIT: o (como en el que pregunta original :))

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

Edit2: Duh, se me olvidó el tomap al final!

19

Aquí hay otra solución que utiliza un Stream de todos los números naturales a partir del 1 al ser comprimido con su Set:

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

+1, esta es la mejor respuesta aquí. – missingfaktor

2

Esto también funcionaría:

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