scala的wordcount实例
package com.wondersgroup.myscala import scala.actors.{Actor, Future} import scala.collection.mutable.ListBuffer import scala.io.Source //首先统计每个文本中出现的频率=》汇总 case class SubmitTask(f:String) case object StopTask //统计一个文本中单词出现的次数 class ActorTest3 extends Actor{ override def act() :Unit = { while (true) { receive{ case SubmitTask(f) => { //把文件的一行内容作为一个元素存入list val lines = Source.fromFile(f).getLines().toList //文件中的每一个单词作为一个元素存入list val words = lines.flatMap(_.split(" ")) print("----------"+words) println("================"+words.map((_,1))) //得到一个map ,当前文本的单词,以及相应单词出现的次数 println("++++++"+words.map((_,1)).groupBy(_._1)) val result = words.map((_,1)).groupBy(_._1).mapValues(_.size) println("&&&&&&&&&&&&&&&&"+result) sender ! result } case StopTask => exit() } } } } object ActorTest3{ def main(args: Array[String]): Unit = { //把文本分析任务提交给actor val replys = new ListBuffer[Future[Any]] val results = new ListBuffer[Map[String,Int]] val files = Array("src/wordcount.txt","src/wordcount1.txt") for(f <- files) { val actor = new ActorTest3 actor.start() val reply = actor !! SubmitTask(f) //把处理结果放到replys replys += reply } //对多个文件的处理结果汇总 while (replys.size > 0) { //判断结果是否可取 val done = replys.filter(_.isSet) print("@@@@@@@@@@@"+done) for(res <- done) { results += res.apply().asInstanceOf[Map[String,Int]] replys -= res } Thread.sleep(5000) } //对各个分析结果进行汇总 val res2 = results.flatten.groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)) println("******************"+res2) } }
输出
@@@@@@@@@@@ListBuffer()----------List(python, is, a, very, brief, language, It, is, also, a, shell, language, we, like, python)================List((python,1), (is,1), (a,1), (very,1), (brief,1), (language,1), (It,1), (is,1), (also,1), (a,1), (shell,1), (language,1), (we,1), (like,1), (python,1)) ----------List(python, java, go, python, c++, c++, java, ruby, c, javascript, c++)================List((python,1), (java,1), (go,1), (python,1), (c++,1), (c++,1), (java,1), (ruby,1), (c,1), (javascript,1), (c++,1)) ++++++Map(java -> List((java,1), (java,1)), c++ -> List((c++,1), (c++,1), (c++,1)), go -> List((go,1)), python -> List((python,1), (python,1)), c -> List((c,1)), ruby -> List((ruby,1)), javascript -> List((javascript,1))) ++++++Map(is -> List((is,1), (is,1)), shell -> List((shell,1)), a -> List((a,1), (a,1)), also -> List((also,1)), language -> List((language,1), (language,1)), brief -> List((brief,1)), python -> List((python,1), (python,1)), It -> List((It,1)), very -> List((very,1)), we -> List((we,1)), like -> List((like,1))) &&&&&&&&&&&&&&&&Map(is -> 2, shell -> 1, a -> 2, also -> 1, language -> 2, brief -> 1, python -> 2, It -> 1, very -> 1, we -> 1, like -> 1) &&&&&&&&&&&&&&&&Map(java -> 2, c++ -> 3, go -> 1, python -> 2, c -> 1, ruby -> 1, javascript -> 1) @@@@@@@@@@@ListBuffer(<function0>, <function0>)******************Map(is -> 2, shell -> 1, a -> 2, java -> 2, c++ -> 3, go -> 1, also -> 1, language -> 2, brief -> 1, python -> 4, It -> 1, c -> 1, ruby -> 1, very -> 1, we -> 1, like -> 1, javascript -> 1)