數組是最基本的數據結構。通常的語法或數據結構書都會先介紹數組,而后再介紹集合,鏈表,樹,哈希表等等。我們也不例外。
定長數組
最簡單的數組創建如下,記住方括號在Scala中用做泛型,相當于<>在Java中作用。
val nums = new Array[Int](10)
// 10個Integer的數組,初始值為零。
更簡潔的數組創建像這樣:
val s = Array("Hello", "World")
省略new的初始化,并且利用類型推斷,無需指明類型。
數組元素的訪問使用()。
s(0) = "Goodbye"
s不是val嗎?為什么可以改變呢?s這里存的是一個數組的reference,reference不能變,但是其內容是可以改變的。另外說一句,遺憾的是,從C時代開始,Index從0開始這一違反人類正常思維的“習慣”一直沿用。
變長數組
Scala中的ArrayBuffer和Java中的ArrayList類似,長度可以改變。
import scala.collection.mutable.ArrayBuffer //注意到,ArrayBuffer在mutable的包中
val b = ArrayBuffer[Int]()
b += 1 //加元素
b += (1, 2, 3, 5) //加數組
數組遍歷
可以使用Index
for (i <- 0 until a.length)
println(i + ": " + a(i))
也可以不用
for (elem <- a) println(elem)
要強調的是,對一個數組(或者其他集合)進行遍歷以一種命令式的編程(imperative programming)。在Scala中,我們往往避免使用,而是使用函數式的方法。強調“做什么”而不是怎么做。以后還會遇到很多例子,你會逐步感受到它們的區別。
通用算法
Scala提供了很多內建通用算法,作用于數組,以及以后會談到的其他數據類型如集合。比如sum,count,max,mKString等等。mKString是一個很使用的方法。參見下面的例子。
Array(1, 2, 3).sum // 6
ArrayBuffer(1, 2, 3).max // 3
val a = Array(1, 10, 2, 9)
scala.util.Sorting.quickSort(a) // 現在a變成了 Array(1, 2, 9, 10)
a.mkString(" and ")
// "1 and 2 and 9 and 10"