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

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. OSI 七层模型以及TCP/IP模型

    OSI 七层模型 定义 OSI(Open System Interconnection)即开放式系统互联通信参考模型.该模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一 ...

  2. IOCP完成端口

    转:https://blog.csdn.net/piggyxp/article/details/6922277 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所 ...

  3. 小程序—银行、券商们下一代APP的进阶方向

    传统金融机构们的App——尤其以手机银行.手机证券为最,发展到今天,已经产生一系列的问题:从用户角度看,体验普遍不好.高度同质化:从业务运营角度看,几乎没有什么“运营”的抓手:从IT角度看,投入产出比 ...

  4. python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:简单 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  5. B - Raising Modulo Numbers

    People are different. Some secretly read magazines full of interesting girls' pictures, others creat ...

  6. 从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备)

    前言 在互联网高速发展的今天,我们通过手机,电脑等通讯设备可以很轻松达到未出茅庐便知天下事的境界.每天我们都要访问数不胜数的网站,通过打开浏览器,输入网址两步搞定.当然更为常规的做法是打开浏览器,设置 ...

  7. System类的两个静态方法currentTimeMillis 和 arraycopy

    package com.yhqtv.demo02.ThreadPool; import java.util.Arrays; public class Test { public static void ...

  8. Serlvet容器与Web应用

    对启动顺序的错误认识 之前一直有个观点,应用运行在Servlet容器中,因为从Servlet容器与Web应用的使用方式来看,确实很有这种感觉. 我们每次都是启动Servlet容器,然后再启动我们的应用 ...

  9. js上传文件前判断获取文件大小并且加以判断

    描述:要求浏览器单个上传文件大小不超过10M. 解决方案: var fileSize = $("#fileId")[0].files[0].size/(1024*1024);if( ...

  10. git、gitLab、github区别

    git是一种版本控制系统,是一个命令.一种工具 gitlib是用于实现git功能的开发库 github是一个基于git实现的在线代码仓库,是一个网站,支持几乎所有git操作,可用于托管代码 gitla ...