Scala學習筆記(三):陣列相關操作
3.1定長資料
val nums= new Array[int] (10) //陣列長度10,所有元素初始化為0
val a=new Array[String] (10) //陣列長度10,所有元素初始化為null
val s=Array("Hello","word") //已提供初始值就不需要new
s(0)="Goodbye" //使用()來訪問元素
3.2 變長陣列:陣列緩衝
對於那種長度按需要變化的陣列,java有ArrayList ,Scala中等效資料結構為ArrayBuffer
import scala.collection.mutable.ArrayBuffer
var b=ArrayBuffer[int]() //一個空的陣列緩衝,準備存放int型別資料
b+=1 //用+=在尾端新增元素
b+=(1,2.3,4)
b++=Array(12,12,13) //使用++=新增集合
b.trimEnd(5) //移除b中最後5個元素
在陣列尾端新增移除袁術是最高效的,也可以在任意位置新增移除,但效率不高,所有在那個元素之後的元素都需要平移
b.insert(2,6) //在下標2之前插入6
b.insert(2,7,8,9) //在下標2之前插入7,8,9)
b.remove(2) //移除下標為2的元素
b.remove(2,3) //從下標為2的元素開始,移除3個元素
資料和陣列緩衝都可以相互轉換:a. toBuffer, b.toArray等。
3.3遍歷陣列和陣列緩衝
for( i < - 區間)例如: for( i <- 0 util a.length) { 邏輯 }
如果想使用兩個元素一跳,可以這些寫0 util (a.length,2) //Rang(0,2,4....)
如果要陣列的尾端開始 (0 Until a.length).reverse
3.4 陣列轉換
通過陣列轉換,可以在保持原陣列不變的前提下,生產一個新的陣列
val a=Array(2,3,5,7,11)
val result=for (elem<-a) yield 2* elem //result的結果是:Array(4,6,10,14,22)
for (....) yield 迴圈創造了一個新陣列,陣列緩衝ArrayBuffer也可以使用這種方式得到一個新的陣列緩衝
一般處理集合時,我們只處理滿足條件的元素,這個需求可以通過守衛:for中的if來實現。
for( elem<- a if elem% 2==0) yield elem*2 //原始集合並沒有收影響。
也可以採取另外一種寫法 a.filter(_%2==0).map(2*_)或者 a.filter{_%2==0}.map(2*_)
3.5 常用演算法
1.sum方法元素型別必須是整型,比如Array(1,2,3).sum
2. min,max求最小最大值
3. sorted方法用於對陣列進行排序返回一個新的陣列或者陣列緩衝(ArrayBuffer),這個過程不會修改原始陣列
4.你還可以提供一個比較函式,不過你需要使用sortWith方法
val bDesc=b.sortWith(_>_)
注意:你可以對一個數組進行排序,但不能對陣列緩衝進行排序
val a=Array(1,7,2,9)
scals.util.Sorting.quickSort(a)
對應min,max,quickSort方法,元素型別必須支援比較操作,這包括了數字,字串以及其它帶有order特質的型別。
最後,顯示陣列和陣列緩衝的內容可以用mkString方法,它允許指定元素之間的分隔符。
a.mkString(" and ") // " 1 and 2 and 3"
a.mkString("<",",",">") // "<1,2,7,9>"
3.6解讀Scaladoc
檢視36頁
3.7多維陣列
Double二維陣列的型別為Array[Array[Double]], 可以用ofDim方法構造二維陣列
var matrix=Array.ofDim[Double](3.4) //三行、四列
要訪問其中的元素
matrix(row)(column)=42
當然還可以建立不規則陣列,沒一行的長度個不相同。
3.8 與JAVA互操作
由於Scala陣列是用java陣列實現的,所以他們之間可以來回切換
舉例來說:java.lang.ProcessBuilder類有一個List<String>為引數的構造器,以下是在Scala中呼叫它的寫法
import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.mutable.ArrayBuffer
varl command=ArrayBuffer("ls","-al")
val pb=new ProcessBulider(command) //Scala到java轉換
Scala的ArraryBuffer被包裝成一個實現了java.util.List介面的Java類物件。
反過來,當Java方法返回java.util.List時,我們可以讓他自動轉換為一個Buffer
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable.Buffer
val cmd:Buffer[String]=pb.command() //java轉到scala,不能使用ArrayBuffer------包裝起來的物件僅能保證是個Buffer.