ScalaNote19-集合练习题01

Exercise01

val sentence = “AAAAAAAAAABBBBBBBBCCCCCDDDDDDD”
将sentence 中各个字符,通过foldLeft存放到 一个ArrayBuffer中

import scala.collection.mutable.ArrayBuffer
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"

def splitSent(x:ArrayBuffer[Char],y:Char)={
    x.append(y)
    x
}
val x = ArrayBuffer[Char]()
sentence.foldLeft(x)(splitSent)
import scala.collection.mutable.ArrayBuffer
sentence: String = AAAAAAAAAABBBBBBBBCCCCCDDDDDDD
splitSent: (x: scala.collection.mutable.ArrayBuffer[Char], y: Char)scala.collection.mutable.ArrayBuffer[Char]
x: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, B, B, C, C, C, C, C, D, D, D, D, D, D, D)
res24: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, B, B, C, C, C, C, C, D, D, D, D, D, D, D)

Exercise02

val sentence = “AAAAAAAAAABBBBBBBBCCCCCDDDDDDD”
使用映射集合,统计一句话中,各个字母出现的次数

// 逻辑比较清楚,出现了就加一,没出现就新建  
import scala.collection.mutable.Map
def letterCount(x:Map[Char,Int],letter:Char)={
   if(x.contains(letter)){
       x(letter)+=1
   } else{
       x(letter) = 1
   }
    x
}
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
val x = Map[Char,Int]()
sentence.foldLeft(x)(letterCount)
import scala.collection.mutable.Map
letterCount: (x: scala.collection.mutable.Map[Char,Int], letter: Char)scala.collection.mutable.Map[Char,Int]
sentence: String = AAAAAAAAAABBBBBBBBCCCCCDDDDDDD
x: scala.collection.mutable.Map[Char,Int] = Map(D -> 7, A -> 10, C -> 5, B -> 8)
res38: scala.collection.mutable.Map[Char,Int] = Map(D -> 7, A -> 10, C -> 5, B -> 8)

更简洁的写法

val sentence = "AAAAAAAAAABBBBBBBBCCCCCDD"
def charCount( map : Map[Char, Int], c : Char ): Map[Char, Int] = {
    // 原来的map存在key则value+1,不存在则value=0
    // map+新的键值对作为返回值  
   map + (c -> (map.getOrElse(c, 0) + 1))
}
val map2 = sentence.foldLeft(Map[Char, Int]())(charCount)
println(map2)
Map(D -> 2, A -> 10, C -> 5, B -> 8)





sentence: String = AAAAAAAAAABBBBBBBBCCCCCDD
charCount: (map: scala.collection.mutable.Map[Char,Int], c: Char)scala.collection.mutable.Map[Char,Int]
map2: scala.collection.mutable.Map[Char,Int] = Map(D -> 2, A -> 10, C -> 5, B -> 8)

Exercise3

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

  • Step1:根据空格拆分单词,这里可以用到flatmap
  • Step2:统计出现次数,用前面那个题就成
def splitWord(x:String)={
    x.split(" ")
}
// lines.flatMap(_.split(" "))
// flatMap对元素处理之后拉平,放入List中
val lines = List("atguigu han hello ", "atguigu han aaa aaa aaa ccc ddd uuu")
val list0 = lines.flatMap(splitWord)
// 统计词频
def wordCount( map : Map[String, Int], c : String ): Map[String, Int] = {
map + (c -> (map.getOrElse(c, 0) + 1))
}
val map2 = list0.foldLeft(Map[String, Int]())(wordCount)
// 做排序  ,降序
println("------------- result ------------- ")
println(map2.toList.sortBy(r => r._2)( Ordering.Int.reverse) )
------------- result ------------- 
List((aaa,3), (han,2), (atguigu,2), (ccc,1), (uuu,1), (hello,1), (ddd,1))





splitWord: (x: String)Array[String]
lines: List[String] = List("atguigu han hello ", atguigu han aaa aaa aaa ccc ddd uuu)
list0: List[String] = List(atguigu, han, hello, atguigu, han, aaa, aaa, aaa, ccc, ddd, uuu)
wordCount: (map: scala.collection.mutable.Map[String,Int], c: String)scala.collection.mutable.Map[String,Int]
map2: scala.collection.mutable.Map[String,Int] = Map(ccc -> 1, aaa -> 3, uuu -> 1, han -> 2, atguigu -> 2, hello -> 1, ddd -> 1)

另一种解法

val lines = List("atguigu han hello ", "atguigu han aaa aaa aaa ccc ddd uuu")

    val res1 = lines.flatMap(_.split(" "))
    println("res1=" + res1)
    // res1.map 说明
    //1. 使用map,返回对偶元组 形式为
    //List((hello,1), (tom,1), (hello,1), (jerry,1), (hello,1), (jerry,1), (hello,1), (kitty,1))
    val res2 = res1.map((_, 1))
    println("res2=" + res2)
    // res2.groupBy(_._1)
    //1. 分组的根据是以元素来分组
    //2. _._1 中的第一个 _ 表示取出的各个对偶元组比如 (hello,1)
    //3. _._1 中的_1, 表示对偶元组的第一个元素,比如 hello
    //4. 因此 _._1 表示我们分组的标准是按照对偶元组的第一个元素进行分组
    //5. 返回的形式为 Map(tom -> List((tom,1)), kitty -> List((kitty,1)), jerry -> List((jerry,1), (jerry,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1)))
    val res3 = res2.groupBy(_._1)
    println("res3=" + res3)

    // x=>(x._1, x._2.size) 传入一个匿名函数,完成统计
    //1.x 表示传入的Map中的各个元素,比如 jerry -> List((jerry,1), (jerry,1))
    //2.x._1 表示 jerry
    //3.x._2.size,表示对 List((jerry,1), (jerry,1))求size,是多少就是多少
    //4.结果是 res4=Map(han -> 2, atguigu -> 2, hello -> 1)
    //5.到此结果就出来了,但是没有排序
    val res4 = res3.map(x=>(x._1, x._2.size))
    println("res4=" + res4 )

    // res4.toList.sortBy(_._2)
    //1. toList先将map转成 list,为了下一步排序
    //5. sortBy就是排序,以对偶元组的第二个值排序,就是大小排序
    val res5 = res4.toList.sortBy(_._2)
    println("res5=" + res5)

    //如果希望从大到小排序,执行reverse即可
    val res6 = res5.reverse

res1=List(atguigu, han, hello, atguigu, han, aaa, aaa, aaa, ccc, ddd, uuu)
res2=List((atguigu,1), (han,1), (hello,1), (atguigu,1), (han,1), (aaa,1), (aaa,1), (aaa,1), (ccc,1), (ddd,1), (uuu,1))
res3=Map(han -> List((han,1), (han,1)), ddd -> List((ddd,1)), ccc -> List((ccc,1)), uuu -> List((uuu,1)), atguigu -> List((atguigu,1), (atguigu,1)), hello -> List((hello,1)), aaa -> List((aaa,1), (aaa,1), (aaa,1)))
res4=Map(han -> 2, ddd -> 1, ccc -> 1, uuu -> 1, atguigu -> 2, hello -> 1, aaa -> 3)
res5=List((ddd,1), (ccc,1), (uuu,1), (hello,1), (han,2), (atguigu,2), (aaa,3))





lines: List[String] = List("atguigu han hello ", atguigu han aaa aaa aaa ccc ddd uuu)
res1: List[String] = List(atguigu, han, hello, atguigu, han, aaa, aaa, aaa, ccc, ddd, uuu)
res2: List[(String, Int)] = List((atguigu,1), (han,1), (hello,1), (atguigu,1), (han,1), (aaa,1), (aaa,1), (aaa,1), (ccc,1), (ddd,1), (uuu,1))
res3: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(han -> List((han,1), (han,1)), ddd -> List((ddd,1)), ccc -> List((ccc,1)), uuu -> List((uuu,1)), atguigu -> List((atguigu,1), (atguigu,1)), hello -> List((hello,1)), aaa -> List((aaa,1), (aaa,1), (aaa,1)))
res4: scala.collection.immutable.Map[String,Int] = Map(han -> 2, ddd -> 1, ccc -> 1, uuu -> 1, atguigu -> 2, hello -> 1, aaa -> 3)
res5: List[(String, Int)] = List((ddd,1), (ccc,1), (uuu,1), (hell...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值