# 集合
## 一、集合简介
Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类:
+ **可变集合**: 可以被修改。即可以更改,添加,删除集合中的元素;
+ **不可变集合类**:不能被修改。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。
## 二、集合结构
scala所有的集合类主要位于`scala.collection` 、`scala.collection.mutable`、`scala.collection.immutable`、`scala.collection.generic`包中 ,大部分集合类存在三类变体,分别位于`scala.collection`, `scala.collection.immutable`, `scala.collection.mutable`包。
- `scala.collection.immutable`包是中的集合是不可变的;
- `scala.collection.mutable`包中的集合是可变的;
- `scala.collection`包中的集合,既可以是可变的,也可以是不可变的。
```scala
val sortSet = scala.collection.SortedSet(1, 2, 3, 4, 5)
val mutableSet = collection.mutable.SortedSet(1, 2, 3, 4, 5)
val immutableSet = collection.immutable.SortedSet(1, 2, 3, 4, 5)
```
如果你仅写了`Set` 而没有加任何前缀也没有进行任何`import`,则Scala默认采用不可变集合类。
```scala
scala> Set(1,2,3,4,5)
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
```
### 3.1 scala.collection
scala.collection包中所有集合如下图:
### 3.2 scala.collection.mutable
scala.collection.mutable包中所有集合如下图:
### 3.2 scala.collection.immutable
scala.collection.immutable包中所有集合如下图:
## 三、Trait Traversable
Scala中所有集合的顶层实现是`Traversable` 。它唯一的抽象方法是`foreach`:
```scala
def foreach[U](f: Elem => U)
```
实现Traversable的集合类只需要实现这个抽象方法,所有其他方法都可以从Traversable继承。Traversable中定义了其余的几十种的方法,具体可以参考官方文档:https://docs.scala-lang.org/overviews/collections/trait-traversable.html
## 四、Trait Iterable
Iterable拓展了Traversable,并定义了一些额外的方法,Scala中所有的集合都直接或者间接实现了Iterable。Iterable中额外定义了十几种方法,具体可以参考官方文档:https://docs.scala-lang.org/overviews/collections/trait-iterable.html
## 五、修改集合
当你想对集合添加或者删除元素,需要根据不同的集合类型选择不同的操作符号:
| 操作符 | 描述 | 集合类型 |
| ------------------------------------------------------------ | ------------------------------------------------- | --------------------- |
| coll(k)
即coll.apply(k) | 获取指定位置的元素 | Seq, Map |
| coll :+ elem
elem +: coll | 向集合末尾或者集合头增加元素 | Seq |
| coll + elem
coll + (e1, e2, ...) | 追加元素 | Seq, Map |
| coll - elem
coll - (e1, e2, ...) | 删除元素 | Set, Map, ArrayBuffer |
| coll ++ coll2
coll2 ++: coll | 合并集合 | Iterable |
| coll -- coll2 | 移除coll中包含的coll2中的元素 | Set, Map, ArrayBuffer |
| elem :: lst
lst2 :: lst | 把指定列表(lst2)或者元素(elem)添加到列表(lst)头部 | List |
| list ::: list2 | 合并List | List |
| set \| set2
set & set2
set &~ set2 | 并集、交集、差集 | Set |
| coll += elem
coll += (e1, e2, ...)
coll ++= coll2
coll -= elem
coll -= (e1, e2, ...)
coll --= coll2 | 添加或者删除元素,并将修改后的结果赋值给集合本身 | 可变集合 |
| elem +=: coll
coll2 ++=: coll | 在集合头部追加元素或集合 | ArrayBuffer |
## 参考资料
1. Martin Odersky . Scala编程(第3版)[M] . 电子工业出版社 . 2018-1-1
2. 凯.S.霍斯特曼 . 快学Scala(第2版)[M] . 电子工业出版社 . 2017-7
3. https://docs.scala-lang.org/overviews/collections/overview.html
4. https://docs.scala-lang.org/overviews/collections/trait-traversable.html
5. https://docs.scala-lang.org/overviews/collections/trait-iterable.html