大数据Scala学习—列表、 集与映射

▼Scala系列学习笔记:

  1. Scala概述与开发环境配置
  2. Scala基础学习之运算符
  3. Scala基础学习之for循环和while循环
  4. 一文掌握scala中的方法和函数
  5. Scala基础:类和对象、访问修饰符和构造器
  6. Scala的继承和抽象类
  7. Scala基础语法之Trait详解
  8. Scala学习之数组与元组

一、列表

列表(List)是Scala中最重要的, 也是最常用的一种数据结构。它存储的数据, 特点是: 有序, 可重复。
在Scala中,列表分为两种, 即: 不可变列表和可变列表。

解释:

1. 有序 的意思并不是排序, 而是指 元素的存入顺序和取出顺序是一致的
2. 可重复 的意思是 列表中可以添加重复元素

1.1 不可变列表

1.1.1 特点

不可变列表指的是: 列表的元素、长度都是不可变的。 

1.1.2 语法

1.2.2 示例

需求

1. 创建一个不可变列表,存放以下几个元素(1,2,3,4)
2. 使用 Nil 创建一个不可变的空列表
3. 使用 :: 方法创建列表,包含-2、-1两个元素 

参考代码

1.2 可变列表

1.2.1 特点

可变列表指的是列表的元素、长度都是可变的.

1.2.2 语法

1.2.3 示例

需求

1. 创建空的整形可变列表.
2. 创建一个可变列表,包含以下元素:1,2,3,4

参考代码 

 

1.2.4 可变列表的常用操作

关于可变列表的常见操作如下: 

示例

1. 定义一个可变列表包含以下元素:1,2,3
2. 获取第一个元素, 并打印结果到控制台.
3. 添加一个新的元素:4
4. 追加一个列表,该列表包含以下元素:5,6,7
5. 删除元素7
6. 删除元素3, 4
7. 将可变列表转换为不可变列表
8. 将可变列表转换为数组
9. 打印结果 

参考代码

 

1.3 列表的常用操作

1.3.1 格式详解

在实际开发中, 我们经常要操作列表, 以下列举的是列表的常用的操作 :

1.3.2 示例一: 基础操作

需求

1. 定义一个列表list1,包含以下元素:1,2,3,4
2. 使用isEmpty方法判断列表是否为空, 并打印结果.
3. 再定义一个列表list2,包含以下元素: 4,5,6
4. 使用 ++ 将两个列表拼接起来, 并打印结果.
5. 使用head方法,获取列表的首个元素, 并打印结果.
6. 使用tail方法,获取列表中除首个元素之外, 其他所有的元素, 并打印结果.
7. 使用reverse方法将列表的元素反转, 并打印反转后的结果.
8. 使用take方法获取列表的前缀元素, 并打印结果.
9. 使用drop方法获取列表的后缀元素, 并打印结果. 

参考代码

 

1.3.3 示例二: 扁平化(压平)

概述

扁平化表示将嵌套列表中的所有具体元素单独的放到一个新列表中. 如下图:

注意: 如果某个列表中的所有元素都是列表, 那么这样的列表就称之为: 嵌套列表 

需求

1. 定义一个列表, 该列表有三个元素, 分别为:List(1,2)、List(3)、List(4,5)
2. 使用flatten将这个列表转换为List(1,2,3,4,5)
3. 打印结果 

参考代码

 1.3.4 示例三: 拉链与拉开

概述

拉链:将两个列表,组合成一个元素为元组的列表

解释: 将列表List("张三", "李四"), List(23, 24)组合成列表List((张三,23), (李四,24))

拉开:将一个包含元组的列表,拆解成包含两个列表的元组

解释: 将列表List((张三,23), (李四,24))拆解成元组(List(张三, 李四),List(23, 24))

需求
1. 定义列表 names, 保存三个学生的姓名,分别为:张三、李四、王五
2. 定义列表 ages, 保存三个学生的年龄,分别为: 23, 24, 25
3. 使用 zip 将列表 names ages, 组合成一个元素为元组的列表 list1
4. 使用 unzip 将列表 list1 拆解成包含两个列表的元组 tuple1
5. 打印结果
参考代码

1.3.5 示例四: 列表转字符串

概述

将列表转换成其对应的字符串形式, 可以通过 toString方法或者mkString方法 实现, 其中

  • toString方法: 可以返回List中的所有元素
  • mkString方法: 可以将元素以指定分隔符拼接起来。

注意: 默认没有分隔符 

需求
1. 定义一个列表,包含元素: 1,2,3,4
2. 使用 toString 方法输出该列表的元素
3. 使用 mkString 方法 , 用冒号将元素都拼接起来 , 并打印结果.
参考代码

3.3.6 示例五: 并集, 交集, 差集

概述 操作数据时, 我们可能会遇到求并集, 交集, 差集的需求, 这是时候就要用到union, intersect, diff这些方法了, 其中

  • union: 表示对两个列表取并集,而且不去重

例如: list1.union(list2), 表示获取list1和list2中所有的元素(元素不去重).

如果想要去除重复元素, 则可以通过 distinct 实现.

  • intersect: 表示对两个列表取交集

例如: list1.intersect(list2), 表示获取list1, list2中都有的元素.

  • diff: 表示对两个列表取差集.

例如:list1.diff(list2),表示获取list1中有, 但是list2中没有的元素.

需求 

1. 定义列表 list1 ,包含以下元素: 1,2,3,4
2. 定义列表 list2 ,包含以下元素: 3,4,5,6
3. 使用 union 获取这两个列表的并集
4. 在第三步的基础上 , 使用 distinct 去除重复的元素
5. 使用 intersect 获取列表 list1 list2 的交集
6. 使用 diffff 获取列表 list1 list2 的差集
7. 打印结果
参考代码

 

二、集 

2.1 概述
Set( 也叫 : ) 代表没有重复元素的集合 。特点是 : 唯一 , 无序
Scala中的集分为两种,一种是不可变集,另一种是可变集。
解释 :
1. 唯一 的意思是 Set 中的元素具有唯一性 , 没有重复元素
2. 无序 的意思是 Set 集中的元素 , 添加顺序和取出顺序不一致
2.2 不可变集
不可变集指的是 元素 , 集的长度都不可变 .
2.2.1 语法
2.2.2 示例一 : 创建不可变集
需求
1. 定义一个空的整型不可变集 .
2. 定义一个不可变集,保存以下元素: 1,1,3,2,4,8.
3. 打印结果 .
参考代码
2.2.3 示例二 : 不可变集的常见操作
格式
1. 获取集的大小( size
2. 遍历集( 和遍历数组一致
3. 添加一个元素,生成一个新的 Set +
4. 拼接两个集,生成一个新的 Set ++
5. 拼接集和列表,生成一个新的 Set ++

注意:

1. - ( 减号 ) 表示删除一个元素 , 生成一个新的 Set
2. -- 表示批量删除某个集中的元素 , 从而生成一个新的 Set
需求
1. 创建一个集,包含以下元素: 1,1,2,3,4,5
2. 获取集的大小 , 并打印结果 .
3. 遍历集,打印每个元素 .
4. 删除元素 1 ,生成新的集 , 并打印 .
5. 拼接另一个集 Set(6, 7, 8), 生成新的集 , 并打印 .
6. 拼接一个列表 List(6,7,8, 9), 生成新的集 , 并打印.
参考代码

 

 

2.3 可变集
2.3.1 概述
可变集指的是 元素 , 集的长度都可变 , 它的创建方式和不可变集的创建方式一致,只不过需要先导入可变集类。
手动导入: import scala.collection.mutable.Set
2.3.2 示例
需求
1. 定义一个可变集,包含以下元素 : 1,2,3, 4
2. 添加元素 5 到可变集中
3. 添加元素 6, 7, 8 到可变集中
4. 从可变集中移除元素 1
5. 从可变集中移除元素 3, 5, 7
6. 打印结果.
参考代码

三、映射

映射指的就是 Map 。它是由键值对 (key, value) 组成的集合。特点是 : 键具有唯一性 , 但是值可以重复 . Scala中, Map 也分为不可变 Map 和可变 Map。
注意 : 如果添加重复元素 ( : 两组元素的键相同 ), 会用新值覆盖旧值

3.1 不可变Map

不可变 Map 指的是 元素 , 长度都不可变 .
语法
需求
1. 定义一个映射,包含以下学生姓名和年龄数据 : 张三 -> 23, 李四 -> 24, 李四 -> 40
2. 打印结果.
参考代码

3.2 可变Map

特点
可变 Map 指的是 元素 , 长度都可变 . 定义语法与不可变 Map 一致 , 只不过需要先手动导包 :
import scala.collection.mutable.Map
需求
1. 定义一个映射,包含以下学生姓名和年龄数据 : 张三 -> 23, 李四 -> 24
2. 修改张三的年龄为 30
3. 打印结果
参考代码

3.3 Map基本操作

格式
1. map(key) : 根据键获取其对应的值 , 键不存在返回 None.
2. map.keys : 获取所有的键 .
3. map.values : 获取所有的值 .
4. 遍历 map 集合 : 可以通过普通 for 实现 .
5. getOrElse: 根据键获取其对应的值 , 如果键不存在 , 则返回指定的默认值 .
6. + : 增加键值对 , 并生成一个新的 Map.
注意 : 如果是可变 Map, 则可以通过 += 或者 ++= 直接往该可变 Map 中添加键值对元素 .
7. - : 根据键删除其对应的键值对元素 , 并生成一个新的 Map.
注意 : 如果是可变 Map, 则可以通过 - = 或者 -- = 直接从该可变 Map 中删除键值对元素.
示例
1. 定义一个映射,包含以下学生姓名和年龄数据 : 张三 -> 23, 李四 -> 24
2. 获取张三的年龄 , 并打印 .
3. 获取所有的学生姓名 , 并打印 .
4. 获取所有的学生年龄 , 并打印 .
5. 打印所有的学生姓名和年龄 .
6. 获取 王五 的年龄,如果 王五 不存在,则返回 -1, 并打印 .
7. 新增一个学生:王五 , 25, 并打印结果 .
8. 李四 从可变映射中移除 , 并打印.
参考代码

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值