开发者学堂课程【Scala 核心编程 - 进阶:集合的综合练习】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9058
集合的综合练习
内容介绍
一、练习一
二、练习二
三、练习三
四、总结
一、练习一
课堂练习1
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD" 将 sentence 中各个字符,通过 foldLeft 存放到一个 ArrayBuffer 中
目的:
理解flodLeft的用法.
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD”
def putArry( arr : ArrayBuffer[Char], c: Char):ArrayBuffer[Char] ={ arr.append(c)
arr
}
//创建val arr = ArrayBuffer[Char]()
val arr = ArrayBuffer[Char]()
sentence.foldLeft(arr)(putArry)
首先 sentence 是一个字符串,这个字符串要求通过左折叠存放到 arraybuffer 中。
目的理解 flodlef 的用法, foldlef 之前提到过,但是基本讲到的是它的运行机制,具体道理是什么用法。
可以这样理解,最后得到的是 arraybufer ,那么里面就是三个 A,把字符里面的东西都取出来,然后放进 bufer 里面,它是整个拆出来,然后弄到 bufer 里面去。
最后是向传的一个值里面走,现在来看一下代码简单的实现。def putArry( arr : ArrayBuffer[Char], c: Char):ArrayBuffer[Char] ={ arr.append(c)
arr
接收一个 arr.append ,来一个接收一个,然后再返回一个,现在我们来进行一个简单的使用, 写 exercise 02 这是我们第二的一个练习,文字的形式比较难写出,平时我们用的也比较少,那么可以用图片的形式表现出来。
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD”
def putArry( arr : ArrayBuffer[Char], c: Char):ArrayBuffer[Char] ={ arr.append(c)
arr
}
//创建val arr = ArrayBuffer[Char]()
val arr = ArrayBuffer[Char]()
sentence.foldLeft(arr)(putArry)
P
rintln(
‘’
arrayBuffer =
‘’
+arrayBuffer)
Def putArray(arr:ArrayBuffer[Char],c:char):ArrayBuffer[Char]
//将C 放入到 arr 中
A
rr . apend(c)
arr
把东西放进数组里面去,我们要深刻的理解这个转折点,类型是 char 做完之后你要给我一个 char 最后返回的类型始终是一个 arraybuffer 的类型,这个时候我们需要引入 buffer ,
我们将 C 放入到 arr当中,我们前面学过往一个 append 里面放
我们要做的事情是左折叠开始运行,开始它是一个字符串,是一个集合 ,字符串是一个有距集合的点,首先定义一个 val ,
等于 new 的 array buffer ,这个就是同步,就是不停的折,
让 putarray,直接看一下最后的 arraybuffer 是什么样,因为 array buffer 是引用的,因为集合是属于 array for 的类型所以它的改变无需再接收,直接打出来就行,我们看看返回类型跟我们想象的是否一样,当我们运行完了之后,会发现跟我们想象的一样,其实就是把每个打散,然后往里面放,这个题的作用就是让大家更加理解折叠,就是要想办法传一个参数,然后不断往里面扔,因为左折叠是必须要求传一个,如果说用到的是 reduce left ,它会默认往里面减少,左折叠就必须传一个,相当于都往里面操作,代码就理解了,理解折叠第一个传入的参数的含义,取决于之后的代码怎么写。
二、练习二
第二题
课堂练习2
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
使用映射集合,统计一句话中,各个字母出现的次数
提示:Map[Char, Int()
1)看看 java 如何实现
Stringsentence="AAAAAAAAAABBBBBBBBCCCCCDDDDDDD*,
2Map<Character, Integer> charCountMap =
new HashMap<Character, Iinteger>();
char()cs= sentence.toCharArray();
for (char c:cs){
if ( charCountMap.containsKey(c)){
Integer count = charCountMap.get(c);
charCountMap.put(c, count+1),
}else {
charCountMap,put(c,1);3}
System.out.printin(charCountMap),
要求使用集合映射,统计一句话,各个字母出现的次数,并且保留在 map 中,
如果用 java 写,应该没有问题,上面一段 java 代码,那么我先定义一个 map 类型,我将字符串转成一个数组,然后再用 for 循环增强,不停取出 char 要进行判断去统计,
首先我判断要不要包含 C ,首先集合里面有没有包含A,就是你曾经已经往 map 里面放进去了,所以说我就取出值,加1然后再放。scale 怎么理解,基本原理是讲述完毕, sentense 代码就是字符串,
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
D
et charcount(map:Map[char,int]c:chaer )map[char int]
然后我在这里传入了一个 map ,而且可以看见 map 是可以变的,我传入了一个 map 不可变的实例,然后调用了 charcount ,这理解接收了一个 C,左折叠是这样做的,右边的第二个参数,会依次遍历增,最后返回一个 map ,可以看到这是 map 的一个操作, map 加了一个新的值,值不确定 ,
如果 C 取出来了,如果 C 没有我返回一个0,这样就有效的解决了判断,如果没有我就取个值然后再加一个1,扔进去然后 map的加,如果这个存在,就是更新,分开写也是可以,我们运用一下,
传的 map 进行加,然后加一个1 因为我们没有把它包起来,这充分运用到 map 的运行,调的时候我用 sentence ,我们左折叠,之前就传了一个空的,类型是 int 类型,然后把 charcount 传递,少了一个6,这个是中括号, 最后返回的结果就是我要的结果.
如图:
我们来打印一下 map2 我们运行之后结果就跟我们想的一样了,用的 map 不太好,这个效率比较低下,修改一下,用可变的 map 来写,我们再写一个代码
//使用可变map实现d
ef charCount2(map:mutable.Map[char,Int],char:char):mutable.Map+=(char - >(map . getorElse(char,0)+1))
第一个是不可变的代码,因为不可变的 map 其实它是每次都产生新的 map ,上面的是不可变的 map ,下面换一个套路,使用可变 map 我在这里写一个 map2 后面这些都应该改一些,加完之后等号就改一下引入包,可变的代码就完成了,我们每次返回的就是它本身,代码就是可以调用的,现在我们使用可变的 map 效率更高.
1.先创建一个可变的 map 作为左折叠的第一个参数,
V
al map3 = mutable . Map [Char.Int]()
S
entence.foldleft (map3)(char count2)
比如说 val map3 等于,这个对我们来说应该很容易,这个就是可变的,我们再操作一下 sentence ,把 map3 传进去,代码就完成,如果是不可变,map3 就已经是结果了,看运行效果,执行的一样,只是效果不同,这是我们运行的两个方式。
三、练习三
第三个题
课后练习3-大数据中经典的 wordcount 案例
val lines = List("atguigu han hello", "atguigu han aaa aaa aaa cccddd uuu")
使用映射集合,list中,各个单词出现的次数,并按出现次数排序
提示:xXX
它是一个经典的案例,要求使用映射集合,统计各个单词出现的次数,我们是已经可以统计了,按照出现次数排序。这是 every buffer 的一个使用。
四.总结
课堂练习一的评讲是 areay 的使用,第2题是 java 的实现,首先说了 java 是怎么实行,又讲了课堂练习二是 scale 的方式实行折叠 一种是可变的 map 一种是不可变的。