在其他语言中,数组Array是在内存中开辟一段连续的内存,一旦声明之后大小不在可变,scala中也是如此,当然scala也提供了长度可变的缓存数组,导入scala.collection.mutable.ArrayBuffer包即可使用缓存数组ArrayBuffer,对ArrayBuffer的操作非常灵活,可以直接用+=添加若干个元素,也可以添加一整个普通数组Array,但此时要使用++=
def main(args: Array[String]): Unit = {
import scala.collection.mutable.ArrayBuffer
var b=ArrayBuffer[Int](4,2)
println("b="+b)
b+=99
b+=(11,22)
b++=Array(6,7,8)
println(b)
}
ArrayBuffer对外提供了很多操作方法:
trimEnd(n: Int): 删除最后n个元素
insert(n: Int, elems: Int*):在指定下标n之后插入可变参数传进来的值
remove(n: Int): 删除指定下标n的元素
remove(n: Int, count: Int):删除指定下标n及之后共count个元素
def main(args: Array[String]): Unit = {
import scala.collection.mutable.ArrayBuffer
var b=ArrayBuffer[Int](9,8,7,6,5)
b.trimEnd(3)
println("after trimEnd ="+b)
b=ArrayBuffer[Int](9,8,7,6,5)
b.insert(1, 99,98,97)
println(b)
b=ArrayBuffer[Int](9,8,7,6,5)
b.remove(1)
println(b)
b=ArrayBuffer[Int](9,8,7,6,5)
b.remove(1,3)
println(b)
}
sorted[B >: A](implicit ord: Ordering[B]): 不传参数可以实现默认的升序排序,排序规则可通过参数传入,特别要注意因为数组是不可变的,所以排完序后会返回一个新的数组,要赋给一个新变量保存
也可以通过 scala.util.Sorting包下的quickSort工具方法进行排序,该方法返回值为Unit,会直接对你原来数组中的值进行操作
def main(args: Array[String]): Unit = {
var a=Array[Int](5,4,6)
var res=a.sorted
println(a.toList)
println(res.toList)
var b=Array[Int](5,4,6)
scala.util.Sorting.quickSort(b)
println(b.toList)
}
对普通数组Array的操作,我们可以在for循环里通过yield关键字在不改变原来数组的情况下,构造符合我们条件要求的数组,也可以通过在for语句中if过滤掉数组中的一些元素,也可以通过filter来过滤,map来构造新数组
def main(args: Array[String]): Unit = {
var a=Array(4,5,6,7,8)
var res=for(item <- a) yield item*2
println(res.toList)
var res2=for(item <- a if(item%2==1)) yield item*2
println(res2.toList)
var res3=a.filter(_%2==1).map(_*2)
println(res3.toList)
}
多维数组的操作也是普遍会遇到的,特别是二维的矩阵操作,我们可以通过var matrix=Array.ofDim【Int】(3,4)创建一个3行4列的矩阵(下标从0开始),通过matrix(i)(j)访问对应行标列标的元素,注意matrix的length返回的是二维数组的行数,三维数组的建立也是类似,length返回第一维的长度
def main(args: Array[String]): Unit = {
var matrix=Array.ofDim[Int](3,4)
matrix(0)(2)=99
for(item <- 0 until matrix.length)
println(matrix(item).toList)
var triple=Array.ofDim[Int](3,4,5)
println(triple.length)
}
多维数组我们还可以通过另一种方法实现,通过将一维数组中的每个元素的值也是一个数组
def main(args: Array[String]): Unit = {
var triple=new Array[Array[Int]](10)
for(i <- 0 to triple.length-1)
triple(i)=new Array[Int](i)
for(i <- 0 to triple.length-1)
println(triple(i).toList)
}