(Questa è una variante a this Q&A)Scala il modo migliore per trasformare una raccolta in una mappa per chiave? (2 ° variante)
Dire che ho questo:
List("foo", "bar", "spam")
voglio creare una mappa per il quale la chiave è la lunghezza della stringa e il valore è una raccolta di tutte le stringhe che hanno quella lunghezza. In altre parole, dato l'elenco su, otterremmo:
Map(3 -> List(foo, bar), 4 -> List(spam))
Il codice che ho scritto per fare questo è:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => m(s.length) = s ::
(if (m.contains(s.length)) m(s.length)
else Nil)
}
Questo funziona, ma aggiunge un sacco di bruttezza a l'elegante risposta fornita da Daniel Spiewak alla domanda originale (di cui sopra).
Qualche idea su come migliorare la soluzione per la mia variante?
Grazie! Sean
Non riesco a trovare l'ultima variante brutta, se la lunghezza della val è abbreviata in val l. Le variabili a lettera singola in scala sono spesso usate in scala in stile simile a formule matematiche, cioè dichiarate il significato di una variabile segnaposto e quindi semplicemente la usate. Poiché ciò porta a espressioni molto brevi (il più delle volte un liner), il nome breve che sarebbe considerato criptico in altre lingue non è un problema nella pratica. – Palimondo
@Palimondo Non è la lunghezza che mi infastidisce. Non mi piace rompere il calcolo in due dichiarazioni. Sfortunatamente, Scala non può ottimizzare 's.length' per riutilizzare il valore, come farebbe Haskell. –