scala作业5

1.用actor并发编程写一个单机版的WorldCount,将多个文件作为输入,计算完成后将多个任务汇总,得到最终的结果
package scala
import java.io.File
import scala.actors.{Actor, Future}
import scala.collection.mutable
import scala.io.Source

/***
  * 一.思路分析
  * 需求:获得本地文件的单词数量,由此可知可通过三个过程就可完成
  * 1.第一过程:获得本地源路径
  * (1)建立源路径类,主构造方法需是String类型
  * 2.第二过程:结果计算获得相应单词的数量成单词-->单词数键值对出现
  * (1)建立计算结果类,主构造方法需是Map键值对类型
  * 3.结束任务:通过建立对象来结束任务
  *
  *
  * 技术难点:单词数量的计算,计算步骤如下
  * 1.获取单词本路径文本内容
  * 2.对内容进行切割,这里按照换行符进行切割成每行,再对每行内容按照空格进行切割
  * 3.通过map获得key值
  * 4.按照key相同进行分组
  * 5.对每个组相同key进行汇总
  *
  *
  */



/**
  * 分析:SubmitTask用于接收单词文本的路径,故此主构造方法应该是String类型
  * @param fileName
  */
case class SubmitTask(fileName: String)
/**
  * 任务结果
  * 1.分析结果应该是单词和单词对应的数量
  * 故此结果类的主构造方法是map类型成键值对形式出现的
  * @param result
  */
case class TaskResult(result: Map[String, Int])
//停止任务
case object StopTask

/**
  * 一.建立Actor的子类
  */
class Task extends Actor {
  override def act(): Unit = {
    loop {
      react {
        //1.提交任务源路径
        case SubmitTask(fileName) => {
          //获取文本内容
          val contents = Source.fromFile(new File(fileName)).mkString
          //通过换行符进行切割成每行
          val arr = contents.split("\r\n")
          //对每行内容再按照空格切割
          val arr1=arr.flatMap(_.split(" "))
          //取出key
          val arr2=arr1.map((_,1))
          //对相同的key进行分组
          val arr3=arr2.groupBy(_._1)
          //对相同的key按照每组进行汇总计算
          val arr4=arr3.mapValues(_.length)
          //1.整合语句方法1
          //val result = arr.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.length)
          //2.整合语句方法2
          //val result = arr.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
          //异步发送消息
          sender ! TaskResult(arr4)
        }
          //停止任务
        case StopTask => {
          exit()
        }
      }
    }
  }
}
//二.建立对象
object WorkCount {
  def main(args: Array[String]) {
    //获取多个文本
    val files = Array("c://words.txt", "c://words.log")
    // 用来存储每个文件的统计结果,类型为Future,并通过HashSet进行去重过滤
    val replaySet = new mutable.HashSet[Future[Any]]
    //将去重的结果存在ListBuffer中
    val resultList = new mutable.ListBuffer[TaskResult]
    for(f <- files) {
      // 启动Actor
      val t = new Task
      // 向actor发送file数据并接收Actor响应的聚合数据
      val replay = t.start() !! SubmitTask(f)
      // 把某个文件的结果数据追加到replys
      replaySet += replay
    }
    while(replaySet.size > 0){
      //replaySet可能存在空值,需要进行空值过滤
      val counter = replaySet.filter(_.isSet)
      for(r <- counter){
        //循环找出空值
        resultList += r.apply().asInstanceOf[TaskResult]
        //移除空值
        replaySet.remove(r)
      }
      //设置线程100ms休眠时间
      Thread.sleep(100)
    }
    //通过foreach遍历输出结果
    resultList.map(_.result).flatten.groupBy(_._1).mapValues(x => x.foldLeft(0)(_ + _._2)).foreach(item => {
      println("("+item._1+","+item._2+")")
    })
  }
}

结果:
I:\apps\Java\jdk1.8.0_191\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=51043:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath I:\apps\Java\jdk1.8.0_191\jre\lib\charsets.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\deploy.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\dnsns.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\jaccess.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\localedata.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\nashorn.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\sunec.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\ext\zipfs.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\javaws.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\jce.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\jfr.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\jfxswt.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\jsse.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\management-agent.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\plugin.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\resources.jar;I:\apps\Java\jdk1.8.0_191\jre\lib\rt.jar;D:\Users\Administrator\actorProgram\out\production\actorProgram;D:\scala-2.10.6\lib\scala-actors-migration.jar;D:\scala-2.10.6\lib\scala-actors.jar;D:\scala-2.10.6\lib\scala-library.jar;D:\scala-2.10.6\lib\scala-reflect.jar;D:\scala-2.10.6\lib\scala-swing.jar;D:\scala-2.10.6\src\scala-actors-src.jar;D:\scala-2.10.6\src\scala-library-src.jar;D:\scala-2.10.6\src\scala-reflect-src.jar;D:\scala-2.10.6\src\scala-swing-src.jar scala.WorkCount
(distributable,1)
(lists,1)
(,284)
(for,5)
(community,2)
(flatten,1)
(in,1)
(mutable,3)
(is,2)
(source,1)
(loop,1)
(100,1)
(collection,1)
(size,1)
(standard,1)
(HashSet,1)
(map,3)
(Software,1)
(touch,1)
(contributed,1)
(Both,1)
(t,2)
(keep,1)
(asInstanceOf,1)
(react,1)
(documentation,1)
(f,2)
(result,7)
(override,1)
(possibilities,1)
(it,1)
(replay,2)
(sleep,1)
(mport,1)
(mkString,1)
(replaySet,5)
(Python's,3)
(fileName,3)
(main,1)
(Array,2)
(way,1)
(println,1)
(open,1)
(Python,4)
(files,2)
(java,1)
(Map,1)
(object,2)
(txt,1)
(code,1)
(you,2)
(license,2)
(contents,2)
(filter,1)
(File,2)
(Int,1)
(making,1)
(help,1)
(administered,1)
(Thread,1)
(The,2)
(Actor,2)
(import,3)
(modules,2)
(on,1)
(remove,1)
(apply,1)
(finalResult,2)
(collaborates,1)
(party,1)
(flatMap,2)
(Source,2)
(hosts,2)
(Package,1)
(allow,1)
(groupBy,3)
(third,1)
(commercial,1)
(ResultTask,4)
(by,1)
(split,3)
(even,1)
(new,4)
(library,1)
(will,2)
(much,1)
(while,1)
(scala,3)
(developed,1)
(WorkCount,1)
(arr,3)
(0,1)
(actors,1)
(exit,1)
(use,1)
(words,2)
(Foundation,1)
(sender,1)
(class,3)
(under,1)
(extends,1)
(args,1)
(an,1)
(length,1)
(def,2)
(io,2)
(ListBuffer,1)
(conferences,1)
(freely,1)
(thousands,1)
(more,1)
(case,5)
(mapValues,3)
(r,3)
(mailing,1)
(Unit,1)
(start,1)
(foldLeft,2)
(StopTask,2)
(act,1)
(Future,2)
(isSet,1)
(toCumpute,2)
(along,1)
(Any,1)
(Task,2)
(of,1)
(log,1)
(and,5)
(val,12)
(resultList,3)
(usable,1)
(meetups,1)
(endless,1)
(SubmitTask,3)
(fromFile,1)
(Index,1)
(OSI-approved,1)
(String,3)
(the,4)



猜你喜欢

转载自blog.csdn.net/weixin_43562705/article/details/91438109