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

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据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. 李四 从可变映射中移除 , 并打印. 参考代码

 

 

以上是关于大数据Scala学习—列表 集与映射的主要内容,如果未能解决你的问题,请参考以下文章

Scala 模式匹配详解

理解Scala的函数式编程思想

Scala之option类型及偏函数使用异常处理正则表达式

2021年大数据常用语言Scala(二十二):函数式编程 映射 map

模拟散列表

大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配