2011-01-31 15 views
19

Come convertire un Set ("a", "b", "c") in una mappa ("a" -> 1, "b" -> 2, "c" -> 3)? Penso che dovrebbe funzionare con toMap.Scala Converti Imposta su Mappa

+2

Vuoi b per mappare a 2 perché è il secondo nel set? O perché è la seconda lettera dell'alfabeto? I set non sono ordinati, come hanno sottolineato altri poster, quindi il primo non funzionerà. –

risposta

30

zipWithIndex è probabilmente quello che stai cercando. Prenderà la tua collezione di lettere e creerà una nuova collezione di tuple, abbinando il valore alla posizione nella raccolta. Si dispone di un requisito in più anche se - sembra che le vostre posizioni iniziano con 1, piuttosto che 0, quindi avrete bisogno di trasformare tali tuple:

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 considerazione in più - Imposta non conservano la posizione. Considerare l'utilizzo di una struttura come Elenco se si desidera che la posizione sopra riportata funzioni in modo coerente.

+0

Questo è quello che volevo. Grazie. –

7

toMap funziona solo se l'insieme degli oggetti sono coppie chiave/valore (ad esempio Set (("a", 1), ("b", 2), ("c", 3))). Per ottenere ciò che si desidera, utilizzare 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 (come in te domanda iniziale :))

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

EDIT2: Duh, ho dimenticato il toMap alla fine!

19

Qui è un'altra soluzione che utilizza una Stream di tutti i numeri naturali a partire dal 1 da zip con il Set:

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

+1, questa è la migliore risposta qui. – missingfaktor

2

Questo potrebbe anche funzionare:

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