Intro
scala集合基本介绍:
- Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问
- 两个主要的包:
- 不可变集合:scala.collection.immutable
- 可变集合: scala.collection.mutable
- Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变(mutable)和不可变(immutable)的版本
- Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型
定长数组
定长数组元素个数固定,元素值可修改。看个Demo:
val arr01 = new Array[Int](4)
println("arr01.length = " + arr01.length)
println("arr01(0)=" + arr01(0))
arr01.foreach((i=>print(i)))
arr01(3) = 10
println("------")
println(arr01.mkString(","))
arr01.length = 4
arr01(0)=0
0000------
0,0,0,10
arr01: Array[Int] = Array(0, 0, 0, 10)
- 创建:[Int] 表。(4) 表示数组长度
- 查:可以用(index)的方式访问对应下标的元素
- 改:也可以指定下标修改元素值
- 删增:定长数组不支持
也可以直接直接初始化数组:
val arr02 =Array(1,3,"cy")
两个小点:
- 之前new Array是构建类Array的实例对象,通过new关键字识别
- 而这里直接初始化数组,用的是伴生对象中的apply方法
- 如果数组元素类型不一致,则为"Any"类型
变长数组
顾名思义,变长数组就是数组可以改变,数组可以增减元素。看个Demo:
import scala.collection.mutable.ArrayBuffer
// 创建
val arr02 = ArrayBuffer[Any](1,2,3,4,5,6,7)
// 查询元素
println("arr02(0) = "+ arr02(0))
// 增加元素
arr02.append(8,9,10)
println(arr02.mkString(","))
// 删除元素,根据索引位置来
// 删除第1个元素
arr02.remove(0)
println(arr02.mkString(","))
//从第1个元素开始,删除两个元素
arr02.remove(0,2)
println(arr02.mkString(","))
arr02(0) = 1
1,2,3,4,5,6,7,8,9,10
2,3,4,5,6,7,8,9,10
4,5,6,7,8,9,10
import scala.collection.mutable.ArrayBuffer
arr02: scala.collection.mutable.ArrayBuffer[Any] = ArrayBuffer(4, 5, 6, 7, 8, 9, 10)
ArrayBuffer有点像Python里的List,可以通过append的方式添加元素
定长数组和变长数组的转换
- arr1.toBuffer //定长数组转可变数组
-
arr2.toArray //可变数组转定长数组
说明:
- arr2.toArray 返回结果才是一个定长数组, arr2本身没有变化,可重新赋值给另一个变量
- arr1.toBuffer返回结果才是一个可变数组, arr1本身没有变化
多维数组
多维数组也经常使用,比如python中numpy的array或者R中的matrix,Scala里这样定义:
//说明:二维数组中有三个一维数组,每个一维数组中有四个元素
val arr = Array.ofDim[Double](3,4)
val array1 = Array.ofDim[Int](3, 4)
array1(1)(1) = 9
for (item <- array1) {
for (item2 <- item) {print(item2 + "\t")}
println()
}
0 0 0 0
0 9 0 0
0 0 0 0
array1: Array[Array[Int]] = Array(Array(0, 0, 0, 0), Array(0, 9, 0, 0), Array(0, 0, 0, 0))