1. 程式人生 > >Scala學習筆記(三):陣列相關操作

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.