若是你須要一個長度不變的始祖,可使用Scala中的Array。例如:java
var arr1 = new Array[Int](10) //10個整數的數組,全部元素初始化爲0。經過簡化apply(10)方法實現 var arr2 = new Array[String](10) //10個元素的字符串數組,全部元素初始化爲null。 var arr3 = Array("Hello","World") //長度爲2的Array[String]——類型是推斷出來的,已經提供初始值就不須要new arr3(0) = "Goodbye" //Array["Goodbye","World"],使用()而不是[]來訪問元素
對於那種長度有變化的數組,Java有ArrayList,C++有vector。Scala中有等效的數據結構ArrayBuffer。算法
import scala.collection.mutable.ArrayBuffer val b = ArrayBuffer[Int]() //一個空的ArrayBuffer,準備添加整數 //或者new ArrayBuffer[Int] b += 1 //ArrayBuffer(1) //用+=在尾端添加元素 b += (1,2,3,4,5) //ArrayBuffer(1, 1, 2, 3, 4, 5) //在尾端添加多個元素 b ++= Array(8,13,21) //ArrayBuffer(1, 1, 2, 3, 4, 5, 8, 13, 21) //你能夠用++=操做符追加任何集合 b.trimEnd(5) //ArrayBuffer(1, 1, 2, 3) //移除最後5個元素 b.trimStart(2) //ArrayBuffer( 2, 3) //移除開頭2個元素
在數組緩衝的尾端添加或移除元素是一個高效的操做。數組
-----------------------------------數據結構
你也能夠在任意位置插入或移除元素,但這樣的操做並不搞笑——全部在那個位置以後的元素都必須被平移。例如:app
b.insert(開始座標,插入元素...) b.remove(開始座標,移除個數)
-----------------------------------ui
另外,邊長數組與定長數組能夠相互轉換spa
b.toArray //變長轉定長 a.toBuffer //定長轉變長
for循環遍歷scala
for(i <- 0 until a.length) println(a(i))
注:until 是RichInt類的方法,返回全部小於但不包括上限的數字。code
-----------------------------------對象
若是想要每兩個元素一跳,能夠這樣進行遍歷
for(i <- 0 until (a.length,2) ) println(a(i))
-----------------------------------
若是要從數組尾端開始,遍歷的寫法爲:
for(i <- (0 until a.length).reverse) println(a(i))
-----------------------------------
入伏哦在循環體中不須要用到數組下標,咱們也能夠直接訪問數組元素:
for(elem <- a) println(elem)
這個和Java中的加強for循環很類似。
1.for推導式
for(...) yield循環建立了一個類型與原始集合相同的新集合。不論數組仍是數組緩衝,你獲得的都將是新的數組或數組緩衝。
for(i <- 1 to 10) yield 2 * i
2.經過守衛
一般,你變裏一個集合時,你只想處理那些知足條件的元素,這個需求能夠經過守衛:for中的if實現。在這裏咱們對每一個偶數翻倍,並去掉奇數元素:
for(i <- 1 to 10 if i % 2 == 0) yield 2 * i
說明:另外一種作法是
var a =Array(1 to 10:_*) a.filter(_ % 2 == 0).map(2 * _) 甚至 a.filter{_ % 2 == 0}.map{2 * _}
sum 數組或數組緩衝求和
max 數組或數組緩衝返回最大值
min 數組或數組緩衝返回最小值
sorted 對數組或數組緩衝排序,返回一個新的數組或數組緩衝
源碼中有兩點值得注意的地方:
1.sorted方法中有個隱式參數ord: Ordering。
2.sorted方法真正排序的邏輯是調用的java.util.Arrays.sort。
-----------------------------------
你能夠對一個數組排序,但不能對數組緩衝區排序:
import scala.util.Sorting._ val a = Array(1,4,3,2) quickSort(a) //a如今是(1,2,3,4)
-----------------------------------
最後,若是你想要顯示數組或數組緩衝的內容,可使用mkString方法,它容許你指定元素間的分隔符,還有一個重載版本能夠指定前綴後綴:
和Java同樣,多維數組是經過數組的數組來實現的。舉例來講,Double的二維數組類型爲Array[Array[Double]]。要構造這樣的一個數組,能夠用ofDim方法:
要訪問其中的元素,須要使用兩個()圓括號
你也能夠建立不規則的數組,每一行長度各不相同:
多維數組的遍歷:
單層遍歷:
雙層遍歷:
因爲Scala數組使用Java數組實現的,咱們能夠在Java和Scala之間來回傳遞
好比,咱們能夠在Scala中使用Java的集合
或者
-----------------------------------
咱們能夠在將Scala變長數組,賦值給Java集合,這須要咱們導入包來支持:
import scala.collection.JavaConversions.bufferAsJavaList
反之,咱們也能夠將剛纔的Java集合轉換成Scala的Buffer,這是咱們須要導入包:
import scala.collection.JavaConversions.asScalaBuffer
可是,從Java的集合轉換成Scala的變長數組,不能使用ArrayBuffer來做爲入參類型,須要用父類Buffer來做爲入參對象
注:使用Java的集合類時,指定類型必須定義泛型,不返回報錯,而且這種轉換隻針對Scala變長數組與Java的集合之間,數組不支持
注:Scala中的泛型是放在[]中的,這裏與Java不同