集合的综合练习 | 学习笔记

简介: 快速学习集合的综合练习

开发者学堂课程【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)

Println(‘’arrayBuffer = ‘’+arrayBuffer)

Def  putArray(arr:ArrayBuffer[Char],c:char):ArrayBuffer[Char]

//将C 放入到 arr 中

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

Det 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,这个是中括号, 最后返回的结果就是我要的结果.

如图:

image.png

我们来打印一下 map2 我们运行之后结果就跟我们想的一样了,用的 map 不太好,这个效率比较低下,修改一下,用可变的 map 来写,我们再写一个代码

//使用可变map实现def charCount2(map:mutable.Map[char,Int],char:char):mutable.Map+=(char - >(map . getorElse(char,0)+1))

第一个是不可变的代码,因为不可变的 map 其实它是每次都产生新的 map ,上面的是不可变的 map ,下面换一个套路,使用可变 map 我在这里写一个 map2 后面这些都应该改一些,加完之后等号就改一下引入包,可变的代码就完成了,我们每次返回的就是它本身,代码就是可以调用的,现在我们使用可变的 map 效率更高.

1.先创建一个可变的 map 作为左折叠的第一个参数,

Val map3 = mutable . Map [Char.Int]()

Sentence.foldleft (map3)(char count2)

比如说 val map3 等于,这个对我们来说应该很容易,这个就是可变的,我们再操作一下 sentence ,把 map3 传进去,代码就完成,如果是不可变,map3 就已经是结果了,看运行效果,执行的一样,只是效果不同,这是我们运行的两个方式。

image.png


三、练习三

第三个题

课后练习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 一种是不可变的。

相关文章
|
负载均衡 监控 Go
使用Golang框架构建分布式系统
本文探讨了使用Golang构建分布式系统的方法。Golang因其高效、简洁的语法和并发支持成为理想的开发语言。文中列举了几个常用的Golang框架,如Echo、Gin、gRPC和NATS等,并强调了服务拆分、通信机制、负载均衡等构建分布式系统的关键要素。通过选择合适的框架,遵循需求分析、技术选型、服务设计等步骤,开发者可以构建出高性能、高可用和可扩展的系统。此外,文中还提供了一个使用gRPC和etcd的简单代码案例来说明实现过程。
910 4
|
JSON 缓存 前端开发
阿里开发手册 嵩山版-编程规约 (十一) 其它
这篇文章是《阿里开发手册 嵩山版》中关于前后端规约的部分,涵盖了前后端交互的API设计、数据格式、错误处理、安全性等关键编程规约,目的是确保前后端开发高效协同,提升软件交付质量。
 阿里开发手册 嵩山版-编程规约 (十一) 其它
|
机器学习/深度学习 算法 Serverless
【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)时序预测算法
【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)时序预测算法
316 1
|
Java 关系型数据库 MySQL
java毕业设计之酒店管理系统(源码+文档)
酒店管理系统的主要使用者分为管理员、用户;用户:首页、个人中心、客房预订管理、入住登记管理、服务费用管理、退房登记管理、我的收藏管理。管理员:首页、个人中心、用户管理、客房类型管理、客房服务管理、客房信息管理、客房预订管理、入住登记管理、服务费用管理、退房登记管理、系统管理等功能。通过这些功能模块的设计,基本上实现了整个酒店信息管理的过程。
|
人工智能 新能源 数据挖掘
固德威与阿里云达成大模型战略合作!
固德威与阿里云达成大模型战略合作!
273 1
|
机器学习/深度学习 人工智能 算法
探索未来编程语言的发展趋势与挑战
随着科技的迅猛发展,编程语言也在不断演变。本文将探讨未来编程语言的发展趋势及面临的挑战,涵盖了人工智能、区块链、量子计算等前沿技术领域,以及如何应对未来编程语言的发展趋势进行探索。
|
NoSQL 大数据 分布式数据库
【云计算与大数据技术】分布式数据库NoSQL中KV、列式、图、文档数据库的讲解(图文解释 超详细)
【云计算与大数据技术】分布式数据库NoSQL中KV、列式、图、文档数据库的讲解(图文解释 超详细)
595 0
|
存储 监控 安全
10 款免费的网络监控工具
互联网的飞速发展,互联网的使用越来越普遍,网络和互联网不仅成为企业内部的沟通桥梁,也是企业和外部进行各类业务往来的重要管道。 网络监控软件定义:指针对局域网内的计算机进行监视和控制,针对内部的电脑上互联网活动(上网监控)以及非上网相关的内部行为与资产等过程管理(内网监控;所以包含了上网监控(上网行为监视和控制、上网行为安全审计)和内网监控(内网行为监视、控制、软硬件资产管理、数据与信息安全),有些还增加了数据安全的透明加密软件部署 1. Monit Monit 是一个Linux/UNIX系统上开源的进程、文件、目录和文件系统监控和管理工具,可自动维护和修复一些错误的情况。
3491 0
|
API 开发工具
企业微信api接口调用-触发企业微信推送会话列表
企业微信api接口调用-触发企业微信推送会话列表