(jest to wariant do this Q&A)Scala najlepszy sposób przekształcenia kolekcji w mapę po klawiszu? (2 wariant)
Say mam to:
List("foo", "bar", "spam")
Chcę utworzyć mapę do którego klucz jest długość ciągów i wartość jest Zbiór wszystkich łańcuchów, które mają taką długość. Innymi słowy, biorąc pod uwagę Lista o, to otrzymujemy:
Map(3 -> List(foo, bar), 4 -> List(spam))
Kod Pisałem to zrobić:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => m(s.length) = s ::
(if (m.contains(s.length)) m(s.length)
else Nil)
}
To działa, ale to dodaje wiele do brzydoty elegancka odpowiedź Daniela Śpiewaka na oryginalne pytanie (wspomniane powyżej).
Jakieś pomysły, jak ulepszyć rozwiązanie dla mojego wariantu?
Dzięki! Sean
Nie uważam ostatniego wariantu za brzydki, jeśli długość val jest skrócona do val l. Zmienne jednoliterowe w scala są często używane w scala w stylu podobnym do formuł matematycznych, tzn. Deklarujesz znaczenie zmiennej zastępczej, a następnie po prostu ją używasz. Ponieważ prowadzi to do bardzo krótkich wyrażeń (najczęściej jednej linijki), krótka nazwa, która w innych językach jest uważana za tajemniczą, nie stanowi problemu w praktyce. – Palimondo
@Palimondo To nie długość mnie drażni. Nie lubię przerywać obliczeń w dwóch wypowiedziach. Niestety, Scala nie może zoptymalizować 's.length', aby ponownie użyć wartości, jak zrobiłby to Haskell. –