package wordCount
import scala.actors.{Actor, Future}
import scala.collection.mutable.ListBuffer
import scala.io.Source
/**
* Created by Adminstrator on 2017/6/10.
*/
class MyActorWC extends Actor{
override def act(): Unit = {
loop {
react {
case WordCount(filePath) => {
val strList: List[String] = Source.fromFile(filePath).getLines().toList
val values: Map[String, Int] = strList.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.size)
// sender ! SendResult(values)
sender ! values
}
case StopProcess() => {
exit()
}
}
}
}
}
case class WordCount(var filePath : String)
case class StopProcess()
case class SendResult(var result : Map[String,Int])
object MyWordCount extends App{
// val re = ListBuffer[Future[Any]]()
// val resultMap = ListBuffer[Map[String,Int]]()
val re = new ListBuffer[Future[Any]]
val resultMap = new ListBuffer[Map[String,Int]]
val path = Array("E:\\大数据(临时存放目录)\\测试数据\\a.txt","E:\\大数据(临时存放目录)\\测试数据\\b.txt","E:\\大数据(临时存放目录)\\测试数据\\c.txt")
for (i <- path){
val m = new MyActorWC
m.start()
val future: Future[Any] = m !! WordCount(i)
re += future
}
while (re.size>0){
val futures: ListBuffer[Future[Any]] = re.filter(_.isSet)
for(j <- futures){
val reMap: Map[String, Int] = j.apply().asInstanceOf[Map[String,Int]]
resultMap += reMap
re -= j
}
Thread.sleep(1000)
}
println("计数结果---》》"+resultMap.flatten.groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)))
}