1. 程式人生 > 其它 >scala高階函式之map

scala高階函式之map

統計一個檔案中單詞個數, 最傳統的寫法

package day3
import scala.collection.mutable
import scala.io.Source

object demo_wordcount {
    def main(args: Array[String]): Unit = {
        // 讀取檔案內容
        val linesInterator = Source.fromFile("D:\\scalas\\wordc.txt").getLines()
        // 統計單詞出現次數, 定義可變map
        val map = mutable.Map[String, Int]()
        
for(line <- linesInterator){ // 分割字串 val words = line.split("\\s+") for(word <- words){ // 開始時map中是空值 val cntOption = map.get(word) if(cntOption.isDefined){ val cnt = cntOption.get +1 map.put(word, cnt) }
else map.put(word,1) } } // 列印生成的map for((k, v) <- map){ println(s"${k}-->${v}") } } }

試試函數語言程式設計來解決

package day3

import scala.io.Source

object demo_wordcount2 {
    def main(args: Array[String]): Unit = {
        // 讀取檔案內容
        val linesInterator = Source.fromFile("
D:\\scalas\\wordc.txt").getLines() // 切分資料 // linesInterator.flatMap(line =>line.split("\\s+")) val words = linesInterator.flatMap(_.split("\\s+")) //分組 // val groupwords = words.toArray.groupBy(word => word).foreach(t=>println(t._1 + "--->"+t._2.mkString(","))) val groupwords = words.toArray.groupBy(word => word) // 聚合 單詞統計 val wordcounts = groupwords.map(kv => (kv._1,kv._2.length)) println(wordcounts) } }

列印同樣的結果 :

Map(meimei -> 1, me -> 1, he -> 1, hello -> 4, ligang -> 1)

能不能再簡單點呢, 好吧, 一句話搞定

package day3

import scala.io.Source

object demo_wordcount2 {
    def main(args: Array[String]): Unit = {
        Source.fromFile("D:\\scalas\\wordc.txt").getLines()
            .flatMap(_.split("\\s+")).toArray
            .groupBy(word => word)
            .map(kv => (kv._1,kv._2.length))
            .foreach(println)

    }

}