对单个文本文件进行单词计数

import scala.actors.Actor
import scala.io.Source //读取文件名称样例类
case class SubmitTask(fileName:String) class Actor2WordCount extends Actor{
override def act(): Unit = {
loop{
react{
case SubmitTask(fileName) =>
//根据文件名称读取文件内容 Source.formFile
val fileContent: String = Source.fromFile(fileName).mkString
//拿到文件内容后进行分割
//首先文件有两行,所以按照换行符先进行分割 window系统:/r/n linux系统:/n mac OS系统:/r
val lines: Array[String] = fileContent.split("\r")
//再根据单词间的分隔符进行切割压平
val words: Array[String] = lines.flatMap(x => x.split(" "))
//还有一种写法
// val words = lines.flatMap(_.split(" "))
//每个单词都标记成一次
val countOne: Array[(String, Int)] = words.map(x => (x, 1))
//进行分组,把元祖第一个元素相同分配到一组
val groupedWords: Map[String, Array[(String, Int)]] = countOne.groupBy(_._1)
//mapValues方法可以作用于map中的v,操作之后和和之前的k返回构成一个新的map
val wordsCount: Map[String, Int] = groupedWords.mapValues(_.length)
println(wordsCount.toBuffer)
}
}
}
} object WordCount{
def main(args: Array[String]): Unit = {
//创建Actor2WordCount对象
val actor = new Actor2WordCount
//启动Actor2WordCount
actor.start()
//发送待处理文件名称给Actor2WordCount
actor ! SubmitTask("/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/1.txt")
}
}

对多个文本文件进行单词计数

import scala.actors.{Actor,Future}
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
import scala.io.{BufferedSource,Source} //读取文件名称样例类
case class SubmitTask(fileName: String) case class Reply(wordsCount: Map[String, Int]) class Actor2WordCount extends Actor {
override def act(): Unit = {
loop {
react {
case SubmitTask(fileName) =>
//根据文件名称读取文件内容 Source.formFile
val fileContent: String = Source.fromFile(fileName).mkString
//拿到文件内容后进行分割
//首先文件有两行,所以按照换行符先进行分割 window系统:/r/n linux系统:/n mac OS系统:/r
val lines: Array[String] = fileContent.split("\r")
//再根据单词间的分隔符进行切割压平
val words: Array[String] = lines.flatMap(x => x.split(" "))
//还有一种写法
// val words = lines.flatMap(_.split(" "))
//每个单词都标记成一次
val countOne: Array[(String, Int)] = words.map(x => (x, 1))
//进行分组,把元祖第一个元素相同分配到一组
val groupedWords: Map[String, Array[(String, Int)]] = countOne.groupBy(_._1)
//mapValues方法可以作用于map中的v,操作之后和和之前的k返回构成一个新的map
val wordsCount: Map[String, Int] = groupedWords.mapValues(_.length) sender ! Reply(wordsCount)
// println(wordsCount.toBuffer)
}
}
}
} object WordCount {
def main(args: Array[String]): Unit = {
//将要读取的文件路径封装到一个数组中
val files = Array("/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/1.txt",
"/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/2.txt",
"/Users/zhaozhuang/Desktop/3、Scala/2、Scala第二天/wordCount/3.txt") //定义一个集合,用于保存每个actor处理完返回的状态
val futureSet: mutable.HashSet[Future[Any]] = new mutable.HashSet[Future[Any]]()
//定义一个集合,用于保存买个actor返回的结果
val resultList = new ListBuffer[Reply]
//循环遍历每一个文件
for (f <- files) {
//创建Actor2WordCount对象
val actor = new Actor2WordCount
//启动Actor2WordCount
actor.start()
//发送待处理文件名称给Actor2WordCount 异步消息且有返回值
val future = actor !! SubmitTask(f)
//把返回状态添加到future集合中
futureSet.+=(future)
}
//遍历futureSet,找出真正处理完的actor,提取其结果future.apply()
while (futureSet.size > 0){
val completeFuture: mutable.HashSet[Future[Any]] = futureSet.filter(x => x.isSet)
//提取处理的结果
for(f <- completeFuture){
val finalResult: Any = f.apply()
val reply: Reply = finalResult.asInstanceOf[Reply]
resultList += reply
//提取完结果后,把future从futureSet移除
futureSet.remove(f)
}
}
println(resultList.map(_.wordsCount).flatten.groupBy(_._1).mapValues(x => x.foldLeft(0)(_+_._2)))
}
}

【Scala】Actor并发编程实现单机版wordCount的更多相关文章

  1. 用scala的actor并发编程写一个单机版的WorldCount

    前言:最近一段时间比较忙,也是比较懒了吧,好长时间没写博客了,新的一年到来,给自己一个小目标,博客坚持写下去,分享一下这历程!废话不多说,开始正题咯(希望大家喜欢!) 首先这算是一个scala程序的入 ...

  2. scala当中的Actor并发编程

    注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 1.什么是Sc ...

  3. *Scala API - 并发编程

  4. scala Actor -03

    1.对于上一篇讲解的scala的一些补充 val files = Array[String]("a.txt","b.txt","c.txt" ...

  5. scala actor编程之对象传递

    scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就 ...

  6. java并发编程 --并发问题的根源及主要解决方法

    目录 并发问题的根源在哪 缓存导致的可见性 线程切换带来的原子性 编译器优化带来的有序性 主要解决办法 避免共享 Immutability(不变性) 管程及其他工具 并发问题的根源在哪 首先,我们要知 ...

  7. 【Scala】Scala多线程-并发实践

    Scala多线程-并发实践 scala extends Thread_百度搜索 scala多线程 - 且穷且独立 - 博客园 Scala和并发编程 - Andy Tech Talk - ITeye博客 ...

  8. 大数据入门第二十一天——scala入门(一)并发编程Actor

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...

  9. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

随机推荐

  1. PHP代码审计(初级篇)

    一.常见的PHP框架 1.zendframwork: (ZF)是Zend公司推出的一套PHP开发框架 功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现. ZF 的组件结构独一无二 ...

  2. Ubuntu上mysql, 通过python连接报错Can't connect to MySQL server on xxx (10061)

    通过sqlyog连接ubuntu上的mysql报错 试了试python直接连接也报同样的错 那应该就是ubuntu上mysql服务自己的问题了 查看mysql 版本 mysql -V root@clo ...

  3. kafka高吞吐量之消息压缩

    背景 保证kafka高吞吐量的另外一大利器就是消息压缩.就像上图中的压缩饼干. 压缩即空间换时间,通过空间的压缩带来速度的提升,即通过少量的cpu消耗来减少磁盘和网络传输的io. 消息压缩模型 消息格 ...

  4. Python最佳工程实践,建立一个完美的工程项目

    在程序开发时候一套好的开发环境和工具栈,可以帮我们极大的提高开发的效率,避免把大量时间浪费在周边琐事上.本文以Python为例,教大家如何快速打造完美的Python项目开发环境:内容涵盖了模块依赖管理 ...

  5. 立体匹配-----NCC视差匹配

    目录 一.立体匹配算法 1.立体匹配算法分类 二.NCC 视差匹配方法 1.原理 2.NCC计算公式 3.算法流程 4.代码实现     5.不同场景运行 三.结论 四.遇到的问题及解决方法 一.立体 ...

  6. 从Mac中完全删除office

    sudo sh -c "curl -s https://raw.githubusercontent.com/jimye/OfficeUninstall/master/office_unins ...

  7. JVM相关参数设置

    Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  8. 2019-2020-1 20199328《Linux内核原理与分析》第十一周作业

    预备实验部分 2019/11/27 10:17:34 下载安装后的界面,如图1 出现vulnerable字样,发现了shellshock漏洞,如图2 实验部分 2019/11/27 10:26:48 ...

  9. AjaxControlToolkit的安装步骤

    1.下载: 下载地址:http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx 打开网址后找到这些: AjaxC ...

  10. 部署企业LNMP架构搭建bbs

    部署企业LNMP架构 1===============部署Nginx 2===============安装及部署Mysql数据库 3===============安装PHP解析环境 4======== ...