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
risposta
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.
Questo è quello che volevo. Grazie. –
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!
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))
+1, questa è la migliore risposta qui. – missingfaktor
Questo potrebbe anche funzionare:
(('a' to 'c') zip (1 to 3)).toMap
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à. –