1. 程式人生 > >[Scala]Scala學習筆記二 陣列

[Scala]Scala學習筆記二 陣列

1. 定長陣列

如果你需要一個長度不變的陣列,可以使用Scala中的Array.

val nums = new Array[Int](10) // 10個整數的陣列 所有元素初始化為0
val strs = new Array[String](10) // 10個字串的陣列 所有元素初始化為null
val s = Array("Hello", "World") // 長度為2的Array[String] 型別是推斷出來的 
s(0) = "GoodBye" // Array("GoodBye","World")

備註

已提供初始值時不要使用new,例如上面的陣列s

使用()而不是[]來訪問元素

在JVM中,Scala的Array以Java陣列方式實現.

2. 變長陣列

對於那種長度按需要變化的陣列,Java有ArrayList.Scala中等效資料結構為ArrayBuffer.

import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]() // 或者 new ArrayBuffer[Int]() 建立一個空的陣列緩衝來存放整數\
b += 1 // ArrayBuffer(1) 用+=在尾端新增元素
b += (1,2,3,5) // ArrayBuffer(1,1,2,3,5) 在尾端新增多個元素
b ++= Array(8, 13, 21) // ArrayBuffer(1,1,2,3,5,8,13,21) 用++=操作追加任何集合
b.trimEnd(5) // ArrayBuffer(1,1,2) 移除最後5個元素

可以在任意位置插入或移除元素,但這樣的操作不如在尾端新增或移除元素操作那麼高效:

b.insert(2,6) // ArrayBuffer(1,1,6,2) 在下標2之前插入
b.insert(2,7,8,9) // ArrayBuffer(1,1,7,8,9,6,2) 插入任意多的元素
b.remove(2) // ArrayBuffer(1,1,8,9,6,2) 刪除下標2的元素
b.remove(2,3) // ArrayBuffer(1,1,2) 第二個引數的含義是要移除多少個元素

有時需要構建一個Array,但不知道最終需要裝多少元素.這種情況下可以先構建一個數組緩衝,然後呼叫:

b.toArray // Array(1,1,2)

3. 遍歷陣列和陣列緩衝

使用for迴圈遍歷陣列和陣列緩衝:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until b.length){
  println(i + "-" + b(i))
}

輸出結果:

0-6
1-5
2-4
3-3
4-2
5-1

備註

until 是RichInt類的方法,返回所有小於(但不包括)上限的數字

如果想要每兩個元素一跳,可以讓i這樣來進行遍歷:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until (b.length, 2)){
  println(i + "-" + b(i))
}

輸出結果:

0-6
2-4
4-2

如果要從陣列的尾端開始:

val b = Array(6,5,4,3,2,1)
for(i <- (0 until b.length).reverse){
  println(i + "-" + b(i))
}

如果在迴圈體中不需要用到陣列下標,我們也可以直接訪問陣列元素:

for(elem <- b){  println(elem)}

4. 陣列轉換

從一個數組(陣列緩衝)出發,以某種方式對它進行轉換是很簡單的.這些轉換操作不會修改原是陣列,而是產生一個全新的陣列:

val a = Array(1,2,3,4)
val result = for(elem <- a) yield 2 * elem // resultArray(2,4,6,8)

for(...) yield迴圈建立了一個型別與原實際和相同的新集合.新元素為yield之後的表示式的值,每次迭代對應一個.

當你遍歷一個集合時,如果只想處理滿足特定條件的元素.可以通過for中的if來實現:

val a = Array(1,2,3,4)
val result = for(elem <- a if elem % 2 == 0) yield 2 * elem

上面例項中對每個偶數元素翻倍,並丟掉奇數元素.

5. 常用操作

5.1 sum

val a = Array(6,1,7,4)
a.sum // 18

要使用sum方法,元素型別必須是數值型別:整型,浮點數或者BigInteger/BigDecimal

5.2 min max

val a = Array(6,1,7,4)
a.min // 1
a.max // 7

min和max輸出陣列或陣列緩衝中最小和最大的元素

5.3 sorted

val a = Array(6,1,7,4)
val asorted = a.sorted // Array(1, 4, 6, 7)

val a = ArrayBuffer(6,1,7,4)
val asorted = a.sortWith(_ > _) // ArrayBuffer(7, 6, 4, 1)

sorted方法將陣列或陣列緩衝排序並返回經過排序的陣列或陣列緩衝,不會修改原始陣列.可以使用sortWith方法提供一個比較函式.

5.4 mkString

val a = Array(6,1,7,4)
a.mkString(" and ") // 6 and 1 and 7 and 4

如果想要顯示陣列或者陣列緩衝的內容,可以使用mkString,允許指定元素之間的分隔符

val a = Array(6,1,7,4)
a.mkString("<", ",", ">") // <6,1,7,4>
該方法的另一個過載版本可以讓你指定字首和字尾