Fixed-Length Arrays
scala> val nums = new Array[Int](10)// An array of ten integers, all initialized with zero nums: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) scala> val a = new Array[String](10)// A string array with ten elements, all initialized with null a: Array[String] = Array(null, null, null, null, null, null, null, null, null, null) scala> val s = Array("Hello", "World")// An Array[String] of length 2—the type is inferred s: Array[String] = Array(Hello, World)
Variable-Length Arrays: Array Buffers
scala> import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.ArrayBuffer scala> val b = ArrayBuffer[Int]() b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> val b = new ArrayBuffer[Int] b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> b += 1 res1: b.type = ArrayBuffer(1) scala> b += (1, 2, 3, 5) res2: b.type = ArrayBuffer(1, 1, 2, 3, 5) scala> b ++= Array(8, 13, 21)\you can append any collection with the ++= operator res3: b.type = ArrayBuffer(1, 1, 2, 3, 5, 8, 13, 21) scala> b.trimEnd(5) scala> b res5: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2)
scala> val a=b.toArray//arraybuffer to array a: Array[Int] = Array(1, 1, 2) scala> a.toBuffer//array to arraybuffer res8: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 1, 2)
Traversing Arrays and Array Buffers
scala> for (i <- 0 until b.length) | println(i + ": " + b(i)) 0: 1 1: 1 2: 6 3: 6 4: 6 5: 2
The variable i goes from 0 to a.length - 1 .
scala> 0 until 10 res15: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) scala> 0 to 10 res16: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
To visit every second element, let i traverse this
scala> for (i <- 0 until (b.length,2)) | println(i + ": " + b(i)) 0: 1 2: 6 4: 6
If you don’t need the array index in the loop body, visit the array elements directly, like this:
scala> for (elem <- b) | println(elem) 1 1 6 6 6 2
Transforming Arrays
Transformations don’t modify the original array, but they yield a new one.
scala> val a = Array(2, 3, 5, 7, 11) a: Array[Int] = Array(2, 3, 5, 7, 11) scala> val result = for (elem <- a) yield 2 * elem result: Array[Int] = Array(4, 6, 10, 14, 22)
Oftentimes, when you traverse a collection, you only want to process the elements that match a particular condition. This is achieved with a guard: an if inside the for:
scala> for (elem<-a if elem%2==0) yield 2 * elem res30: Array[Int] = Array(4)
Given a sequence of integers, we want to remove all but the first negative number:
val indexes = for (i <- 0 until a.length if a(i) < 0) yield i for (j <- (1 until indexes.length).reverse) a.remove(indexes(j))
Common Algorithms
scala> Array(1, 7, 2, 9).sum res31: Int = 19 scala> ArrayBuffer("Mary", "had", "a", "little", "lamb").max res1: String = little scala> val b = ArrayBuffer(1, 7, 2, 9) b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 7, 2, 9) scala> val bSorted = b.sorted bSorted: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 7, 9) scala> val bSorted = b.sortWith(_ > _) bSorted: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(9, 7, 2, 1) scala> b.mkString(" and ") res2: String = 1 and 7 and 2 and 9
Multidimensional Arrays
Multidimensional arrays are implemented as arrays of arrays. A two-dimensional array of Double values has the type Array[Array[Double]], to construct such an array, use the ofDim method:
scala> val matrix = Array.ofDim[Double](3, 4) // Three rows, four columns matrix: Array[Array[Double]] = Array(Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0, 0.0))
Access an element: matrix(row)(column) = 42
With varying row lengths:
scala> val triangle = new Array[Array[Int]](10)\只指定了10列,和每一列的类型,即Array[Int],但是没有指定每一列的元素个数。 triangle: Array[Array[Int]] = Array(null, null, null, null, null, null, null, null, null, null) scala> for (i <- 0 until triangle.length) | triangle(i) = new Array[Int](i + 1) scala> triangle res2: Array[Array[Int]] = Array(Array(0), Array(0, 0), Array(0, 0, 0), Array(0, 0, 0, 0), Array(0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0, 0), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0))