[Scala]Scala學習筆記二 陣列
阿新 • • 發佈:2018-12-25
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 // result 是Array(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>
該方法的另一個過載版本可以讓你指定字首和字尾