Scala - 数组

数组分为可变数组ArrayBuffer和不可变数组Array。
Array Array是不可变数组,这里的不可变是指对象的引用不能变,他的长度是固定的不能变的,但是他的元素却是可以更改的。
定义一个不可变数组:

// 长度为3的数字,默认都是0,[]里是类型,()里是长度 val arr1: Array[Int] = new Array[Int](3) // 直接定义数组的元素,这里就是直接调用apply方法了 val arr2: Array[Int] = Array(1, 2, 3)

【Scala - 数组】读取、修改:
println(arr1(0)) // 0 println(arr2(0)) // 1 arr1(0) = 1 arr2.update(0, 11) println(arr1(0)) // 1 println(arr2(0)) // 11

转为字符串,并用-连接:
println(arr2.mkString("-")) // 1-2-3

求最大值、最小值、求和:
println(arr2.sum) // 16 println(arr2.max) // 11 println(arr2.min) // 2

往前面或后面新增元素,由于是不可变数组,所以返回的是新的数组。
  • .+:():方法,加号在前面,所以往前面加元素
  • .:+():方法,加号在后面,所以往后面加元素
  • +::符号,加号在前面,所以往前面加元素
  • :+:符号,加号在后面,所以往后面加元素
val arr3 = arr2.+:(10).:+(4) println(arr3.mkString("-")) // 10-11-2-3-4val arr4 = 8 +: 9 +: arr3 :+ 5 :+ 6 println(arr4.mkString("-")) // 8-9-10-11-2-3-4-5-6

遍历数组:
until、to 、indices是取索引,然后通过索引取值。until和to的区别是to是等于数组的长度until是小于。
后面几个都是直接取数组的元素。
for (i <- 0 until arr2.length) print(arr2(i) + "-") // 11-2-3- println() for (i <- 0 to arr2.length - 1) print(arr2(i) + "-") // 11-2-3- println() for (i <- arr2.indices) print(arr2(i) + "-") // 11-2-3- println() for (i <- arr2) print(i + "-") // 11-2-3- println() arr2.foreach((e: Int) => print(e + "-")) // 11-2-3- println() arr2.foreach(println) // 11 2 3

ArrayBuffer ArrayBuffer是可变数组,所以可以对他进行新增、删除等操作。
// 长度为3的数字,默认空,[]里是类型,()里是长度 var arr1: ArrayBuffer[Int] = new ArrayBuffer() var arr2: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3) println(arr1) // ArrayBuffer() println(arr2) // ArrayBuffer(1, 2, 3)

读取、修改,这个和不可变数组不一样的是,由于没有初始值,所以不能读取已经赋值。
// println(arr1(0)) // error // arr1(0) = 1 // errorprintln(arr2(0)) // 1 arr2(0) = 11 println(arr2(0)) // 11 arr2.update(0, 1) println(arr2(0)) //

转为字符串,并用-连接,求最大值、最小值、求和遍历数组,这些同不可变数组,这里不做演示。
向前或向后新增元素,包括方法和符号两种:
arr2.append(4) println(arr2.mkString("-")) // 1-2-3-4 arr2.appendAll(ArrayBuffer(5, 6)) println(arr2.mkString("-")) // 1-2-3-4-5-6 arr2.prepend(99) println(arr2.mkString("-")) // 99-1-2-3-4-5-6 arr2.prependAll(ArrayBuffer(97, 98)) println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-6arr2 += 7 println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-7 arr2 += (8, 9) println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-6-7-8-9 arr2 ++= ArrayBuffer(10, 11) println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-6-7-8-9-10-11arr2 :+= 12 println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-6-7-8-9-10-11 arr2 +:= 96 println(arr2.mkString("-")) // 96-97-98-99-1-2-3-4-5-6-7-8-9-10-11

指定位置新增元素:
arr2.insert(4, 100) println(arr2.mkString("-")) // 96-97-98-99-100-1-2-3-4-5-6-7-8-9-10-11-12 arr2.insertAll(5, ArrayBuffer(101, 102)) println(arr2.mkString("-")) // 96-97-98-99-100-101-102-1-2-3-4-5-6-7-8-9-10-11-12

删除元素,可以指定位置、指定位置+删除长度、指定元素删除:
arr2.remove(4) println(arr2.mkString("-")) // 96-97-98-99-101-102-1-2-3-4-5-6-7-8-9-10-11-12 arr2.remove(4, 2) println(arr2.mkString("-")) // 96-97-98-99-1-2-3-4-5-6-7-8-9-10-11-12 arr2 -= 96 println(arr2.mkString("-")) // 97-98-99-1-2-3-4-5-6-7-8-9-10-11-12 arr2 -= (97, 98, 99) println(arr2.mkString("-")) // 1-2-3-4-5-6-7-8-9-10-11-12

转换 不可变数组和可变数组直接是可以转换的。比如下面的例子中,arr3是Array类型的,通过toBuffer方法转换为Buffer的arr4,arr4通过toArray方法转为Array的arr5
val arr3 = new Array[Int](4) val arr4: mutable.Buffer[Int] = arr3.toBuffer val arr5: Array[Int] = arr4.toArray

    推荐阅读