一、数组
1.不可变数组Array
(1) 定义
第一种定义方式
val arr1 = new Array[Int](10)
第二种定义方式,利用apply方法
val arr1 = Array(1, 2)
数组的访问,与Java用[]不同,Scala中用()
println(arr1(0))
(2) 遍历
根据索引遍历
for(i <- 0 until arr01.length) {
print(arr01(i))
}
//简化写法
for(i <- nums.indices) {
print(arr01(i))
}
直接遍历数组中的元素
for (item <- arr01) {
println(item)
}
遍历元素执行某个函数,调用foreach方法
arr2.foreach( (elem: Int) => println(elem) )
//继续简化
arr.foreach( println )
(3) 在首尾添加元素
+:看起来像一个运算符,但其实是一个方法,返回一个新的数组
val newArr2 = newArr.+:(30)
//通过空格省略.
val newArr3 = newArr2 :+ 15
val newArr4 = 19 +: 29 +: newArr3 :+ 26 :+ 73
//打印数组,对于Array,println(arr2) 打印的是引用地址
println(newArr4.mkString(", "))
2.可变数组ArrayBuffer
大数据里面很少有需要用可变数组的场景,所以为避免不必要的问题,一般能用不可变数组就用不可变数组
(1) 定义
val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()
val arr2 = ArrayBuffer(23, 57, 92)
//对于ArrayBuffer,println(arr2)可以直接打印出数组
println(arr2)
//转换为不可变数组Array
val newArr: Array[Int] = arr1.toArray
// 6. 不可变数组转换为可变数组
val buffer: mutable.Buffer[Int] = newArr.toBuffer
Q:为什么println(arr)打印ArrayBuffer可以打印出数组,但是打印Array打印出的是引用地址?
A:println(arr)实际调用的是println(arr.toString()),ArrayBuffer本身是没有toString方法的,是通过隐式转换调用的IterableLike的toString方法,在这个方法里打印了数组。而对于Array,它首先直接继承的java.io.Serializable,因此它直接调用的Java的Object的toString方法,自然不会再去找隐式转换里的方法
(2) 添加元素
//在末尾添加36
arr1.append(36)
//在开头添加11和76
arr1.prepend(11, 76)
//在索引位置1添加13和59
arr1.insert(1, 13, 59)
//在索引位置1直接加入另一个数组的所有元素
arr1.insertAll(2, newArr1)
//在开头添加另一个数组的所有元素
arr1.prependAll(newArr2)
(3) 删除元素
//删除索引位置3的元素
arr1.remove(3)
//从索引位置0开始删除10个元素
arr1.remove(0, 10)
//删除指定值的元素
arr1 -= 13
3.多维数组
(1) 定义
ofDim() 最多可接收5个参数创建5维数组
//说明:二维数组中有三个一维数组,每个一维数组中有四个元素
val arr = Array.ofDim[Double](3,4)
(2) 访问和遍历
val arr = Array.ofDim[Int](3, 4)
arr(1)(2) = 88
//遍历二维数组
for (i <- arr) { //i 就是一维数组
for (j <- i) {
print(j + " ")
}
通过foreach遍历
array.foreach(line => line.foreach(println))
array.foreach(_.foreach(println))