foldLeft

Scala语言中,foldLeft函数的三个使用场景:

列表内数值的相加,作用相当于sum;

List(1,7,2,9).foldLeft(0)(_-_)

(1)List从左开始

(2)结果在左面

0-1

(0-1)-7

((0-1)-7)-2

(((0-1)-7)-2)-9

List(1,7,2,9).foldRight(0)(_-_)

(1)List从右开始

(2)结果在右面

9-0

2-(9-0)

7-(2-(9-0))

1-(7-(2-(9-0)))

变换后的Map集合有重复key值,并且需要根据key值合并

合并Map重复key值统计词长度

package spark2021

import scala.collection.mutable.Map
object foldLeft_test {
  def main(args: Array[String]): Unit = {


    //场景一:列表数值相加
    val list = List(1,2,3,4,5)
    val sum_list: Int = list.foldLeft(0)(_+_)
    println("sum_list"+sum_list)
    //map++更新数据 map+添加数据

    //合并两个Map
    //++:重复key值相加,不覆盖
    var map1 = Map("aa" -> 1, "bb" -> 2)
    var map2 = Map("aa" -> 2, "cc" -> 4)

    val map3: Map[String, Int] = map1++map2
    println("map3"+map3) //Map(aa -> 2.0, bb -> 2.0, cc -> 4.0)

    //foldLeft:map相同key的value没有被覆盖,而是相加合并了
    val map4: Map[String, Int] = map1.foldLeft(map2) {
      case (newMap, (name, score)) => {
        newMap + (name -> (score + map2.getOrElse(name, 0)))
//        newMap += (name -> (score + newMap.getOrElse(name, 0)))

      }
    }

    println("map4"+map4) //Map(aa -> 3, cc -> 4, bb -> 2)



    //统计不同长度单词的总词频
    val wordsMap = Map("apple" -> 20, "pear" -> 10, "pineapple" -> 25, "grape" -> 30)
    val map5= wordsMap.foldLeft(Map.empty[Int,Int]){
      case(newMap,(fruit,count))=>{
        newMap+(fruit.length->(count+newMap.getOrElse(fruit.length,0)))
      }
    }
    println("map5"+map5)

//    sum_list15
//    map3Map(bb -> 2, cc -> 4, aa -> 2)
//    map4Map(bb -> 2, cc -> 4, aa -> 3)
//    map5Map(5 -> 50, 4 -> 10, 9 -> 25)

  }

}

 

posted on 2021-01-05 09:11  happygril3  阅读(121)  评论(0)    收藏  举报

导航