Angenommen, SieCount Vorkommen jedes Element in einer Liste [Liste [T]] in Scala
val docs = List(List("one", "two"), List("two", "three"))
wo zum Beispiel haben List („eins“, „zwei“) stellt ein Dokument Begriffe „einen“ und „zwei“ enthält, und Sie mögen für jeden Begriff eine Karte mit der Dokumenthäufigkeit bauen, das heißt in diesem Fall
Map("one" -> 1, "two" -> 2, "three" -> 1)
Wie Würdest du das in Scala machen? (Und auf effiziente Art und Weise, unter der Annahme, eine viel größere Datenmenge.)
Meine erste Java-like Gedanke ist eine veränderbare Karte zu verwenden:
val freqs = mutable.Map.empty[String,Int]
for (doc <- docs)
for (term <- doc)
freqs(term) = freqs.getOrElse(term, 0) + 1
, die gut genug funktioniert, aber ich frage mich, wie Sie könnte Machen Sie das "funktional", ohne auf eine veränderbare Karte zurückzugreifen?
Sie können die Map-Initialisierung verkürzen:' docs.flatten.foldLeft (Map [String, Int]() withDefaultValue 0) {(m, x) => ...} ' – paradigmatic
Danke!Ich habe keine Ahnung, warum ich diese Funktion übersehen habe ... – Landei
Es scheint schneller als 'groupBy', also dies als akzeptiert zu markieren. Aber beide Antworten sind interessant. –