一起学scala--数组相关操作
定长数组
数组创建后长度不能改变。
// 创建一个长度为10,Int类型的数组。
val arr = new Array[Int](10)
// 当已提供初始值时,就不需要用new了
// 长度为2的String数组
val arr = Array("hello","hi")
// 我们使用()而不是[]来访问数组中的元素
arr(0) = "good luck"
变长数组:数组缓冲
类似java中的ArrayList,c++中的vector。
import scala.collection.mutable.ArrayBuffer
val buff = new ArrayBuffer[Int]()
//往buff添加元素。
buff+=1
//你也可以一次添加多个元素
buff+=(2,3,4) // 相当于buff.+=(elem:Int*)
//++= 可以追加任何Int集合
buff++=ArrayBuffer(5,6)
//移除尾部3个元素
buff.trimEnd(3)
//1,2,3
//在buff中插入元素
buff.insert(0,7)
//7,1,2,3
//移除任意位置的元素
buff.remove(2)
//7,1,3
//ArrayBuffer和Array的互转
buff.toArray // ArrayBuffer转为Array
arr.toBuffer // Array转为ArrayBuffer
遍历Array和ArrayBuffer
// 0到len-1
for(i <- 0 until arr.length){
print(s"$i:${arr(i)}")
}
// 内置函数返回数组下标值
for(i <- arr.indices){
print(s"$i:${arr(i)}")
}
// 倒序遍历,步长设置为-1
for(i <- arr.length-1 to 0 by -1){
print(s"$i:${arr(i)}")
}
// 也可以对下标进行反转
for(i <- arr.indices.reverse){
print(s"$i:${arr(i)}")
}
// 如果不需要下标,想直接取其中的元素
for(elem <- arr){
print(elem)
}
数组转换
当你遍历一个集合时,只想处理那些满足特定条件的元素或者对集合中的元素进行操作后返回一个新的集合存储操作后的结果时,你可以这样做。
// 对每个偶数元素进行翻倍,并丢掉奇数元素。
// range 返回一个数组,其中包含一个范围内递增的整数序列。(左闭右开的区间,不包含10)
val arr = Array.range(1,10)
// 上一篇博文说过 for/yield 推导式返回的就是一个序列。
val result: Array[Int] = for (elem <- arr if elem % 2 == 0) yield elem * 2
//4 8 12 16
// 另一种做法如下:
// filter和map都是scala的高级函数这个我们之后会详细说。
val result: Array[Int] = arr.filter(_%2==0).map(_*2)
常用算法
//求和 只适用元素类型是数值类型的。
val arr = Array.range(1,10)
val sum = arr.sum // 45
//最大最小元素
val strs = Array("hello","a","bb")
strs.max //"hello"
strs.min //"a"
//排序
//与java不同的是,scala排序,原数组并不会变化,返回的是一个新的数组。
val result1 = arr.sorted
//如果想自定义排序规则,你可以使用sortWith()方法。
val result2: Array[Int] = arr.sortWith((x, y) => x > y)
//这里用的是scala的函数式编程,我们可以进一步简写。
val result3: Array[Int] = arr.sortWith(_>_)
//在java中我们可以用Arrays.toString()来打印数组中的元素。
//在scala我们可以用mkString方法。
arr.mkString(",") // 1,2,3,...,9
// 去除数组中重复的部分
val arr = Array(1,1,2,3)
val distinct = arr.distinct // 1,2,3
多维数组
// 构造一个3行4列的二维数组。
val arr: Array[Array[Int]] = Array.ofDim[Int](3, 4)
//你也可以构造不规则数组。每一行长度各不相同。
val array = new Array[Array[Int]](3)
//array是3行的,使用的时候要自己new 一个行数组。
array(0) = new Array[Int](10)
//访问多维数组。
arr(0)(0) = 1