Scala 入门 WordCount

此代码仅供学习参考,若有理解错误的地方请及时联系博主,谢谢。

package FileIO
import scala.io.Source;
import scala.util.matching.Regex

object WordIO {
  def main(args: Array[String]) {
    val Sit = Source.fromFile("D://cc.txt").getLines()    // 文件读取,按行  
    val word = Sit.flatMap { line => line.split(" ") }    // 分离word
    val wordregex = word.flatMap(str => stringregex(str)) 
    val group = wordregex.foldLeft(Map.empty[String, Int]) {    // 向左折叠 def foldLeft[B](z: B)(op: (B, A) => B): B = {   A的类型其实就是调用这个函数的类型this.seq
      (kv, str) => kv + (str -> (kv.getOrElse(str, 0) + 1))    // 初始化一个要得到的类型B(Map[String,Int]) 由A和B进过op,就是操作最终生成B(第一步是Empty的Map放入一个str和0+1,第二步传入的是第一步产生的Map及wordregex中第二个值,进行if else)
    }    // map中的ifelse操作  Map[String,Int](也就是kv)中存在str则用str的值+1,若没有就用0+1          
    for(kv <-group){println(kv)}
   
  }  

  def stringregex (str: String) : List[String] = {
    val pattern = new Regex("[a-zA-Z]*['|’]?[a-zA-Z]*");    // 排除,."“” 但要保留’'等,使统计更精确
    val string = (pattern findAllIn(str)).mkString("")
    return List(string)    
  }
}

对于flatLeft()函数的解释:

def foldLeft[B](z: B)(op: (B, A) => B): B = {  
    var result = z  
    this.seq foreach (x => result = op(result, x))  
    result  
  } 
此方法接受2个参数,z和op,一个是B类型的参数,一个是返回B类型的函数。
在看到这个trait其实是TraversableOnce,可迭代的集合。
def seq: TraversableOnce[A]
比如一个val listA = List(1,2,3)
listA其实是实现了TraversableOnce这个trait的。
我们可以直接使用:
[java] view plain copy
scala> listA.foldLeft(0)((sum,i)=>sum+i)  
res26: Int = 6  

这个里面的0其实就是z返回值是Int类型即B类型
那么可以看出op这个函数返回值也需要是Int类型
可以看出
val result = z, 这里其实就是0,x=>result=op(result, x) , sum其实也是z
其实z就是返回值,this.seq在这里就是list,对list遍历,这里执行op函数。
这里我们执行的是sum+i,就是累加了1+2+3=6



对于getOrElse()函数的解释:

Map中的if()else()操作的变型
在Spark中写法是:persons.getOrElse("Spark",1000) //如果persons这个Map中包含有Spark,取出它的值,如果没有,值就是1000。
for循环访问persons里面的Key和value
for((key,value)<- persons)
println(key+":"+value)
值:Hadoop:11
Spark:6

函数参考来源:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值