5.1 数组
Scala 语言中提供的数组是用来存储固定大小的同类型元素。
声明数组变量并不是声明 number0、number1、…、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。
数组的第一个元素索引为0,最后一个元素的索引为元素总数(数组长度)减1。
5.1.1 声明数组
Scala 数组声明的语法格式:
var 数组名:Array[元素类型] = new Array元素类型
或
var 数组名 = new Array元素类型
【例】
执行测试方法test1,输出结果:
5.1.2 多维数组
多维数组一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。矩阵与表格是我们常见的二维数组。
多维数组的声明:
var 数组名 = Array.ofDim[元素类型](第一维的长度,第二维的长度,……)
【例】
执行测试方法test2,输出结果:
5.1.3 数组常用的方法
5.1.3.1 合并数组
def concatT: Array[T]
【例】
输出结果:
5.1.3.2 创建区间数组
def range( start: Int, end: Int, step: Int ): Array[Int]
创建指定区间(start <= x
输出结果:
5.1.3.3 返回指定长度的数组
def tabulateT(f: (Int)=> T): Array[T]
返回指定长度数组,每个数组元素为指定函数的返回值,默认从 0 开始。
def tabulateT( f: (Int, Int ) => T): Array[Array[T]]
返回指定长度的二维数组,每个数组元素为指定函数的返回值,默认从 0 开始。
def iterateT( f: (T) => T ): Array[T]
返回指定长度数组,每个数组元素为指定函数的返回值。与tablulate不同之处在于同,iterate可以指定函数参数的初始值。
【例1】
输出结果:
【例2】
输出结果:
5.1.3.4 填充数组
def fillT(elem: => T): Array[T]
返回数组,长度为第一个参数指定,同时每个元素使用第二个参数进行填充。
def fillT( elem: => T ): Array[Array[T]]
返回二数组,长度为第一个参数指定,同时每个元素使用第二个参数进行填充。
【例】
输出结果:
5.1.3.5 复制数组
def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit
复制一个数组到另一个数组上。
【例】
输出结果:
5.2 集合
Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。
Scala 集合分为可变的和不可变的集合。
可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。
而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。
5.2.1 List(列表)
5.2.1.1 不可变列表
Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是。
- 列表声明:列表的元素类型 T 可以写成 List[T]。
- 链接表式声明:构造列表的两个基本单位是 Nil 和 ::
- ::表示是链接。
- Nil 表示为一个空列表。
5.2.1.2 可变列表
声明可变列表,需要导入包
import scala.collection.mutable.ListBuffer
【例】
输出结果:
5.2.1.3 列表常用方法
1、 生成、连接List
List与数组相似,生成、连接List的方法与数组相同。
【例】
输出结果:
2、返回列表元素
- head 返回列表第一个元素
- tail 返回一个列表,包含除了第一元素之外的其他元素
- last:返回最后一个元素
- lengt返回列表长度
- max查找最大元素
- min查找最小元素
- sum计算集合元素之和
- isEmpty 在列表为空时返回true
- equals判断是否相等
- take (n: Int): List[A] 提取列表的前n个元素
- takeRight(n: Int): List[A] 提取列表的最后n个元素
- takeWhile: takeWhile(p: (A) ⇒ Boolean): List[A] 从左向右提取列表的元素,直到条件p不成立
- filter(p: (A) => Boolean): List[A]输出指定条件的所有元素
- indexOf(elem: A, from: Int): Int从指定位置 from 开始查找元素第一次出现的位置
- lastIndexOf(elem: A, end: Int): Int在指定的位置 end 开始查找元素最后出现的位置
【例】
输出结果:
3、丢弃List元素
def distinct: List[A] 去除列表的重复元素,并返回新列表
def drop(n: Int): List[A] 丢弃前n个元素,并返回新列表
def dropRight(n: Int): List[A] 丢弃最后n个元素,并返回新列表
def dropWhile(p: (A) => Boolean): List[A] 从左向右丢弃元素,直到条件p不成立
【例】
输出结果:
4、反转List
def reverse: List[A]
用于将列表的顺序反转。
【例】
输出结果:
5、排序
def sorted[B >: A]: List[A]
def sortWithB>:A=> T): List[T]
列表排序
【例】
输出结果:
6、复制元素到数组
def copyToArray(xs: Array[A], start: Int, len: Int): Unit
将列表的元素复制到数组中。
【例】
输出结果:
7、计算元素
def mapB => B): List[B]
通过给定的方法将所有元素重新计算
【例】
输出结果:
8、扁平化
- flat即压扁,压平,扁平化。效果就是将集合中的每个元素的子元素映射到某个函数并返回新的集合
- flatMap先执行map,在执行flatten
【例】
输出结果:
9、交集
def intersect(that: Seq[A]): List[A]
计算多个集合的交集
【例】
输出结果:
10、归约
reduce,reduceLeft从左向右归约
reduceRight就是从右向左归约
如:元组c展开为(1,2,3,4,5),转换成(key:value)结构的话,可以看作((null,1),(null,2),(null,3),(null,4)…)。将具有相同key(null)的值进行进行归并计算。
【例】
输出结果:
11、遍历元素
def foreach(f: (A) => Unit): Unit
将函数应用到列表的所有元素
【例】
输出结果:
5.2.2 Set(集合)
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的且集合中的对象不按特定的方式排序。
Scala 集合分为可变的和不可变的集合。默认情况下,Scala 使用的是不可变集合。如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。
可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。 而对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。
【例】
输出结果:
Set常用的方法与List同
5.2.3 Map(映射)
Map(映射)是一种可迭代的键值对(key/value)结构。
所有的值都可以通过键来获取。
Map 中的键都是唯一的,Map 也叫哈希表(Hash tables)。
Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。
默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map 类。在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。
5.2.3.1 Map基本操作
keys:返回 Map 所有的键(key)
values:返回 Map 所有的值(value)
isEmpty:在 Map 为空时返回true
+(key->value):添加元素
++ 运算符或 Map.++() :来连接两个 Map,Map 合并时会移除重复的 key
【例】
输出结果:
5.2.3.2 常用方法
5.2.4 Tuple(元组)
元组与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的。
【例】
输出结果:
5.2.5 Iterator(迭代器)
Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。
迭代器 it 的两个基本操作是 next 和 hasNext。调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。调用 it.hasNext() 用于检测集合中是否还有元素。
让迭代器 it 逐个返回所有元素最简单的方法是使用 while 循环。
【例】
输出结果: