Scala -WordCount详解

WordCount详解

1 集合扁平化

首先我们接收一个字符串,

val lines = List("abc han hello ","abc han aaa aaa aaa ccc ddd uuu ")
val res1 = lines.flatMap((s:String) => s.split(" "))

首先是集合的扁平化 我们首先接收的是字符串,进行一个分隔

输出结果:
在这里插入图片描述

然后我们把上述的代码简化一下: _代表的是一个默认值 此时默认值是集合中的子元素

val res1 = lines.flatMap(_.split(" "))
    println("res1="+res1)

输出结果与上一致。

2 做成一个对偶List=> 才能分组并统计

我们调用.map()函数,可以看到它提示我们第一个传的是字符串,返回值没有规定
Scala -WordCount详解_第1张图片

遍历res1的集合,首先挨个的传入一个字符串进来,我们定义这个字符串为s
然后我们把它组合成 (s,1)

    val res1 = lines.flatMap(_.split(" "))
    println("res1="+res1)

    //2. 步骤=> 做成一个对偶List=> 才能分组并统计
    val res2 = res1.map((s:String) => (s,1))
    println("res2="+res2)

查看结果:
在这里插入图片描述

我们再次简化,变成如下的:

val res2 = res1.map((_,1))
    println("res2="+res2)

3 分组 把不同的单词归属到不同的组

val res3 = res2.groupBy((x:(String,Int)) => x._1)
    println("res3="+res3)

我们首先把形参给弄出来: x:(String,Int) 遍历一个一个的是元组
那么x._1的含义是

  1. x元组中 第一个参数是String 第二个参数是Int
  2. 那么x._1 代表的就是String(也就是元组中的第一个元素)

我们要对当前元组x的第一个元素String 进行分组:
在这里插入图片描述

再次简化变成:

    val res3 = res2.groupBy(_._1)
    println("res3="+res3)

4 对上面的各个元组,进行统计大小

在这里插入图片描述

val res4 = res3.map((x:(String,List[(String,Int)]))=> (x._1,x._2.size))
println("res4="+res4)

在这里插入图片描述

再次简化:

val res4 = res3.map(x=>(x._1,x._2.size))
    println("res4="+res4)

注意:不能写成 map(_.1,._2.size)
因为下划线不能出现2次。

5 排序

首先res4() 是一个Map
我们把res4转换成一个List列表,再调用sortBy()
大小排序:reverse

 val res5 = res4.toList.sortBy((x:(String,Int))=>x._2).reverse
    println("res5:"+res5)

简写:

val res5 = res4.toList.sortBy(_._2).reverse
    println("res5:"+res5)

在这里插入图片描述

6 合并

//合并
    println(lines.flatMap(_.split(" ").map((_,1)).groupBy(_._1).map(x=>(x._1,x._2.size))
      .toList.sortBy(_._2).reverse))

7 全代码

package com.Word

object WordCount {

  def main(args: Array[String]): Unit = {

    /*
    val lines = List("atguigu han hello ","atguigu han aaa aaa aaa ccc ddd uuu ")
    使用映射集合  list中  各个单词出现的次数,  并按出现次数排序(从大到小)
     */

    val lines = List("abc han hello ","abc han aaa aaa aaa ccc ddd uuu ")
    //1. 首先集合扁平化, 传入的是字符串
//    val res1 = lines.flatMap((s:String) => s.split(" "))
//    println("res1= " + res1 ) //res1= List(abc, han, hello, abc, han, aaa, aaa, aaa, ccc, ddd, uuu)

    val res1 = lines.flatMap(_.split(" "))
    println("res1="+res1)

//    //2. 步骤=> 做成一个对偶List=> 才能分组并统计
//    val res2 = res1.map((s:String) => (s,1))
//    println("res2="+res2)

    //2. 步骤=> 做成一个对偶List=> 才能分组并统计
    val res2 = res1.map((_,1))
    println("res2="+res2)

//    val res3 = res2.groupBy((x:(String,Int)) => x._1)
//    println("res3="+res3)
//    //res3=Map(han -> List((han,1), (han,1)), abc -> List((abc,1),
//    //(abc,1)), ddd -> List((ddd,1)), ccc -> List((ccc,1)), uuu -> List((uuu,1)),
//    // hello -> List((hello,1)), aaa -> List((aaa,1), (aaa,1), (aaa,1)))

    val res3 = res2.groupBy(_._1)
    println("res3="+res3)

//    val res4 = res3.map((x:(String,List[(String,Int)]))=> (x._1,x._2.size))
    val res4 = res3.map(x=>(x._1,x._2.size))
    println("res4="+res4)
    //res4=Map(han -> 2, abc -> 2, ddd -> 1, ccc -> 1, uuu -> 1, hello -> 1, aaa -> 3)


//    val res5 = res4.toList.sortBy((x:(String,Int))=>x._2).reverse
    val res5 = res4.toList.sortBy(_._2).reverse
    println("res5:"+res5)

    //合并
    println(lines.flatMap(_.split(" ").map((_,1)).groupBy(_._1).map(x=>(x._1,x._2.size))
      .toList.sortBy(_._2).reverse))



  }

}

你可能感兴趣的:(Scala)