scala学习笔记之Map和flatMap

应用Map和flatMap将一个英文文档切分成单词并统计每个单词出现的次数

package com.zyc.scala

import java.io.File

import org.apache.commons.io.FileUtils

import scala.collection.mutable

/**
* Created with IntelliJ IDEA.
* Author: zyc2913@163.com
* Date: 2020/9/20 19:50
* Version: 1.0
* Description:Map和flatMap的应用
*/
object StudyCollection1 {
  def main(args: Array[String]): Unit = {
    //list集合的每个元素*2
    val list:List[Int] = List[Int](1,2,3,4,5)
    val res:List[Int] = list.map(_ * 2)
    println(res) //控制台输出:List(2, 4, 6, 8, 10)
    //分析.map(),算子map方法返回的是一个object,map将流中的当前元素替换为此返回值;
    //声明:def map(f: A => B): That =
    //参数: 一元函数,参数是原集合的泛型,返回值是任意类型
    //返回值:和原集合类型相同的集合
    //作用: 将集合中的每一个元素应用到f中,并将返回值收集到一个新的集合中

    //将二维集合变成一维集合
    val arr:Array[Array[String]] = Array(Array("a","c","e","g"),Array("b","d","f","h"))
    val res1 = arr.flatMap(x => x).toList
    println(res1) //控制台输出:List(a, c, e, g, b, d, f, h)
    //分析:.flatMap(), 压扁映射
    //声明:def flatMap(f: A => GenTraversableOnce[B]): That =
    //参数: 一元函数   参数是原来集合的泛型  返回值必须是一个集合,并且这个集合的泛型可以和原集合不同
    //返回值:和原集合类型一样,泛型是B类型
    //作用:将二维集合变成一维集合

//以上是知识点,以下是实例应用

    /**
     * 需求:将一个英文文件切分成单词并计数
     */
    //1.读取文件,整个文件相当于一个字符串
    val ttLines = FileUtils.readFileToString(new File("C:\\Users\\Administrator\\Desktop\\book\\TheThreeMusketeers.txt"))
    //2.按行切分(\n),每行相当于一个数组元素,整个文件是一个数组,所以数据类型是数组型
    val strings:Array[String] = ttLines.split("\n")
    /**
     * 将每行都继续切分成单词,相当于整个文件(一个数组)里装了多个数组
     * \\s表示   空格,回车,换行等空白符,
     * +号表示一个或多个的意思,
     * val array:Array[Array[String]] = strings.map(_.split("\\s+")).flatMap(x => x)
     * 这一句和下面的一句是相同的作用
     */
    //3.把整个文件(一个数组)先切分再把文件中的大写转成小写,把非字母的字符用空格代替,得到一个数组型的字符串
    val str:Array[String] = strings
             .flatMap(_.split("\\s+"))
             .map(_.toLowerCase().replaceAll("\\W", ""))
    //4.建立一个map用来盛放切分出的单词并计数
    val map = new mutable.HashMap[String, Int]()
    //5.遍历整个文件,将每次拿到的单词放入map中并计数
    for (word <- str){
      map.put(word,map.getOrElse(word,0)+1)
    } 

//6.打印到控制台
    println(map) //控制台输出Map(serviceand -> 1, isstill -> 1, saidthat -> 1, beggedto -> 1, himselfthe -> 2, frayed -> 1,...)

  }

}

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页