Próbuję kodować w najprostszy sposób program do liczenia wystąpień słów w pliku w języku Scala. Do tej pory mam ten kawałek kodu:Początkujący Scala - najprostszy sposób zliczania słów w pliku
import scala.io.Codec.string2codec
import scala.io.Source
import scala.reflect.io.File
object WordCounter {
val SrcDestination: String = ".." + File.separator + "file.txt"
val Word = "\\b([A-Za-z\\-])+\\b".r
def main(args: Array[String]): Unit = {
val counter = Source.fromFile(SrcDestination)("UTF-8")
.getLines
.map(l => Word.findAllIn(l.toLowerCase()).toSeq)
.toStream
.groupBy(identity)
.mapValues(_.length)
println(counter)
}
}
Nie przejmuj się wyrażeniem wyrażeń regularnych. Chciałbym wiedzieć, jak wyodrębnić pojedyncze słowa z kolejności pobierane w tym wierszu:
map(l => Word.findAllIn(l.toLowerCase()).toSeq)
w celu uzyskania każdego occurency słowo policzone. Obecnie otrzymuję mapę z sekwencjami zliczanych słów.
Jestem bardzo nowe do Scala, więc mam trochę problemów ze zrozumieniem anonimową funkcję przejść do foldLeft. Skąd wiadomo, aby odwrócić kolejność krotki, którą przekazujesz (count, word)? –
Liczba jest faktycznie mapą [String, Int], a słowo jest łańcuchem. –
Tak, teraz rozumiem, pierwszym elementem krotki jest akumulator, a drugim elementem jest element foldLeft, który się iteruje. –