7.集 合
第 7 章 集 合
7.1 集合简介
Scala 的集合有三大类:序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable 特质。
对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两 个包
- 不可变集合:scala.collection.immutable
- 可变集合: scala.collection.mutable
Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而 不会对原对象进行修改。类似于 java 中的 String 对象
可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似 于 java 中 StringBuilder 对象
建议:在操作集合的时候,不可变用符号,可变用方法
7.1.1 不可变集合继承图

1)Set、Map 是 Java 中也有的集合
2)Seq 是 Java 没有的,我们发现 List 归属到 Seq 了,因此这里的 List 就和 Java 不是同一个 概念了
3)我们前面的 for 循环有一个 1 to 3,就是 IndexedSeq 下的 Range
4)String 也是属于 IndexedSeq
5)我们发现经典的数据结构比如 Queue 和 Stack 被归属到 LinearSeq(线性序列)
6)大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序
7)IndexedSeq 和 LinearSeq 的区别:
- IndexedSeq 是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位
- LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找
7.1.2 可变集合继承图

7.2 数组
7.2.1 不可变数组
1)第一种方式定义数组
定义:val arr1 = new Array[Int](10)
(1)new 是关键字
(2)[Int]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定 Any
(3)(10),表示数组的大小,确定后就不可以变化
2)第二种方式定义数组
定义: val arr1 = Array(1, 2)
(1)在定义数组时,直接赋初始值
(2)使用 apply 方法创建数组对象
3)案例实操
1 | object Test01_ImmutableArray { |
7.2.2 可变数组
1)定义变长数组
val arr01 = ArrayBuffer[Any](3, 2, 5)
(1)[Any]存放任意数据类型
(2)(3, 2, 5)初始化好的三个元素
(3)ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer
2)案例实操
(1)ArrayBuffer 是有序的集合
(2)增加元素使用的是 append 方法(),支持可变参数
1 | object Test02_ArrayBuffer { |

7.2.3 不可变数组与可变数组的转换
1)说明
arr1.toBuffer //不可变数组转可变数组
arr2.toArray //可变数组转不可变数组
arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化
arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化
1 | object Test02_ArrayBuffer { |

7.2.4 多维数组
1)多维数组定义
1 | val arr = Array.ofDim[Double](3,4) |
说明:二维数组中有三个一维数组,每个一维数组中有四个元素
2)案例实操
1 | object Test03_MulArray { |
7.3 列表 List
7.3.1 不可变 List
1)说明
(1)List 默认为不可变集合
(2)创建一个 List(数据有顺序,可重复)
(3)遍历 List
(4)List 增加数据
(5)集合间合并:将一个整体拆成一个一个的个体,称为扁平化
(6)取指定数据
(7)空集合 Nil
2)案例实操
1 | object Test04_List { |

7.3.2 可变 ListBuffer
1)说明
(1)创建一个可变集合 ListBuffer
(2)向集合中添加数据
(3)打印集合数据
2) 案例实操
1 | object Test05_ListBuffer { |

7.4 Set 集合
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包
7.4.1 不可变 Set
1)说明
(1)Set 默认是不可变集合,数据无序
(2)数据不可重复
(3)遍历集合
2)案例实操
1 | object Test06_ImmutableSet { |

7.4.2 可变 mutable.Set
1)说明
(1)创建可变集合 mutable.Set
(2)打印集合
(3)集合添加元素
(4)向集合中添加元素,返回一个新的 Set
(5)删除数据
2)案例实操
1 | object Test07_MutableSet { |

7.5 Map
集合 Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value) 映射
7.5.1 不可变 Map
1)说明
(1)创建不可变集合 Map
(2)循环打印
(3)访问数据
(4)如果 key 不存在,返回 0
2)案例实操
1 | object Test08_ImmutableMap { |

7.5.2 可变 Map
1)说明
(1)创建可变集合
(2)打印集合
(3)向集合增加数据
(4)删除数据
(5)修改数据
2)案例实操
1 | object Test09_MutableMap { |

7.6 元组
1)说明
元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。
注意:元组中最大只能有 22 个元素。
2)案例实操
1 | object Test10_Tuple { |

7.7 集合常用函数
7.7.1 基本属性和常用操作
1)说明
(1)获取集合长度
(2)获取集合大小
(3)循环遍历
(4)迭代器
(5)生成字符串
(6)是否包含
2)案例实操
1 | object Test11_CommonOp { |

7.7.2 衍生集合
1)说明
(1)获取集合的头
(2)获取集合的尾(不是头的就是尾)
(3)集合最后一个数据
(4)集合初始数据(不包含最后一个)
(5)反转 (6)取前(后)n 个元素
(7)去掉前(后)n 个元素
(8)并集
(9)交集
(10)差集
(11)拉链
(12)滑窗
2)案例实操
1 | object Test12_DerivedCollection { |
1 | 1 |
7.7.3 集合计算简单函数
1)说明
(1)求和
(2)求乘积
(3)最大值
(4)最小值
(5)排序
2)代码实操
1 | object Test13_SimpleFunction { |

(1)sorted 对一个集合进行自然排序,通过传递隐式的 Ordering
(2)sortBy 对一个属性或多个属性进行排序,通过它的类型。
(3)sortWith 基于函数的排序,通过一个 comparator 函数,实现自定义排序的逻辑。
7.7.4 集合计算高级函数
1)说明
过滤
- 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
转化/映射(map)
- 将集合中的每一个元素映射到某一个函数
扁平化
扁平化+映射
- 注:flatMap 相当于先进行 map 操作,在进行 flatten 操作 集合中的每个元素的子元素映射到某个函数并返回新集合
分组(group)
- 按照指定的规则对集合的元素进行分组
简化(归约)
折叠
2)集合转换操作(Map类)
1 | object Test14_HighLevelFunction_Map { |

3)集合转换操作(Reduce类)
1 | object Test15_HighLevelFunction_Reduce { |

4)Fold 方法
Fold 折叠:化简的一种特殊情况。
1 | object Test16_MergeMap { |

7.7.5 普通 WordCount 案例
1)需求
单词计数:将集合中出现的相同的单词,进行计数,取计数排名前三的结果
2)需求分析

3)代码实操
1 | object Test17_CommonWordCount { |

7.7.6 复杂 WordCount 案例
1 | object Test18_ComplexWordCount { |

7.8 队列
1)说明
Scala 也提供了队列(Queue)的数据结构,队列的特点就是先进先出。进队和出队的方 法分别为 enqueue 和 dequeue。
2)案例实操
1 | object Test19_Queue { |

7.9 并行集合
1)说明
Scala 为了充分使用多核 CPU,提供了并行集合(有别于前面的串行集合),用于多核 环境的并行计算。
2)案例实操
1 | object Test20_Parallel { |




