Scala学习(十二)——集合类型

Scala学习(十二)——集合类型

本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(十二)——集合类型
简介

Java和C++里提供了十分方便的集合类供我们使用,Scala也不例外。

使用Java中的集合类

因为Scala可以直接使用Java库中的类,所以直接使用Java中的集合类也是可以的。用法和Java几乎完全相同:

但是,如果只是这样的话,就没必要写这篇文章了。Scala也提供了自已的集合类型,相比之下,在Scala中用这些类型才更好。

数组Array

和Java不同,Scala中没有数组类型这一设定。Scala的数组是名为Array的类。但是不要担心效率问题,在编译时,会变成JVM中的数组的。
Array数组的特征:长度不可变,可随机访问。
准确来说,数组不能算作是集合,只能算作数据结构而已。
下面是一个使用数组的例子:

Scala中,也可以从值构建数组:

集合Set

(注:本章的“集合”指Set,本文的标题中的“集合”指collection,比Set含义要宽)
以是否可编辑来区分,集合有可变和不可变两种;以实现方式区分,集合有HashSetTreeSet等几种。这里我们主要关心的是集合的抽象性质,所以用前者来区分。至于后者,在使用时将Set类型替换成相应类型即可。
集合Set的特征:不存在重复元素(用##==来判断是否相等),无序(不可随机访问),判断对象是否存在于Set中时一般较快(取决于实现)。
创建集合有两种方法,一是用new关键字新建,二是用Set对象的apply方法。用apply方法的好处是可以直接赋值。

不可变的Set有以下操作:

值得注意的是以上每一个语句都新建了一个Set对象,而不曾修改参与运算的对象的内容,正是符合了不可变的要求。对于可变类型,可以这样使用:

链表List

和Java里不同,Scala中List一定是以链表方式实现的。Java中的List概念对应Scala中的Seq
链表的特征:元素有先后之分,适合逐个访问。
不可变链表的使用方法:

可变链表的更多使用方法:

可变数组ArrayBuffer

Scala中的这个类更像是Java中常用的ArrayList类。
特征是:元素有先后之分,可以重复,可以随机访问,但是在中间插入时效率不高。
用法见下例:

映射Map

Scala中的Map和Java中功能类似。
和Scala中其他的集合类型也很类似,有可变和不可变之分,也有HashMap等不同类型的实现,也有+++之类的操作。下面给出一些其他集合没有的操作:

其中的"one" -> 1是一个特殊的用法,用于创建一个Tuple2,和("one", 1)所等价。也就是说,Map储存了一系列的键值对,然后对键建立了索引,以达到快速访问的效果。

总结

Scala提供了和其他语言相同的基本集合类型以方便程序员使用,但和其他语言又有些许不同。
一,Scala中的集合类型有可变和不可变之分。这是因为函数式编程鼓励使用不可变量,以保持方法的函数性质。而可变量又是兼容了其他非函数式语言的设计。
二,Scala的集合大量使用了重载运算符来完成集合操作。对这一点我的看法是,虽然简洁了,但不那么显然了。所幸Scala也提供了函数名版的操作方法,所以也可以不使用运算符。
然后,整理一下这些类型的特点:

类型 长度可变 内容可变 可重复 插入 删除 按下标/键访问 按值访问 备注
Array - -
Set - - -
mutable.Set -
List - - 访问头尾时快
MutableList 访问和增删头尾时快
ArrayBuffer 增删尾部快
Map 否/是 - - 值可重复
mutable.Map 否/是

以及一些操作的运算符:

运算符 作用
+ 与元素合并产生新的集合
++ 与集合合并产生新的集合
+: 在前面添加元素产生新的集合
::
:+ 在后面添加元素产生新的集合
++: 在前面添加集合产生新的集合
:::
:++ 在后面添加集合产生新的集合
- 去除元素产生新的集合
-- 去除集合产生新的集合
+= +类似但修改自身而不返回新集合
++= ++类似但修改自身而不返回新集合
+=: +:类似但修改自身而不返回新集合
++=: ++:类似但修改自身而不返回新集合
-= -类似但修改自身而不返回新集合
--= --类似但修改自身而不返回新集合