(Dies ist eine Variante zu this Q&A)Scala der beste Weg, eine Sammlung in eine Map-by-Key zu verwandeln? (2. Variante)
Sagen, ich habe dies:
List("foo", "bar", "spam")
Ich möchte eine Karte erstellen, für die der Schlüssel ist die Länge des String ist und der Wert ist Eine Sammlung aller Strings mit dieser Länge. Mit anderen Worten, die etwa Liste gegeben, würden wir bekommen:
Map(3 -> List(foo, bar), 4 -> List(spam))
Der Code, den ich geschrieben habe, dies zu tun ist:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => m(s.length) = s ::
(if (m.contains(s.length)) m(s.length)
else Nil)
}
Dies funktioniert, aber es fügt eine Menge von Hässlichkeit die elegante Antwort, die Daniel Spiewak auf die ursprüngliche Frage gegeben hat (siehe oben).
Irgendwelche Ideen, wie man die Lösung für meine Variante verbessert?
Danke! Sean
Ich finde die letzte Variante nicht hässlich, wenn val Länge auf val l verkürzt wird. Variablen mit einem Buchstaben in scala werden häufig in scala ähnlich wie mathematische Formeln verwendet, d. H. Sie deklarieren die Bedeutung einer Platzhaltervariablen und verwenden sie dann einfach. Da dies zu sehr kurzen Ausdrücken führt (meistens ein Liner), ist der Kurzname, der in anderen Sprachen als kryptisch angesehen würde, in der Praxis kein Problem. – Palimondo
@Palimondo Es ist nicht die Länge, die mich nervt. Ich mag es nicht, die Berechnung in zwei Aussagen zu brechen. Leider kann Scala 's.length' nicht optimieren, um den Wert wiederzuverwenden, wie es Haskell tun würde. –