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...