Scala學習(三)數組相關操做

1.定長數組

若是你須要一個長度不變的始祖,可使用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"],使用()而不是[]來訪問元素

2.變長數組:數組緩衝

對於那種長度有變化的數組,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  //定長轉變長

3.遍歷數組和數組緩衝

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循環很類似。

4.數組轉換

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 * _}

5.經常使用算法

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方法,它容許你指定元素間的分隔符,還有一個重載版本能夠指定前綴後綴:

6.多維數組

和Java同樣,多維數組是經過數組的數組來實現的。舉例來講,Double的二維數組類型爲Array[Array[Double]]。要構造這樣的一個數組,能夠用ofDim方法:

要訪問其中的元素,須要使用兩個()圓括號

你也能夠建立不規則的數組,每一行長度各不相同:

多維數組的遍歷:

單層遍歷:

雙層遍歷:

7.Scala數組與Java數組相互轉換

因爲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不同

相關文章
相關標籤/搜索