1. 程式人生 > >快學scala 第三章 讀書筆記及習題答案程式碼

快學scala 第三章 讀書筆記及習題答案程式碼

chapter 3 陣列相關操作

標籤:快學scala

一、筆記

  1. scala的Array以java陣列方式實現,陣列在JVM中的型別為java.lang.String[].
  1. scala>import scala.collection.mutable.ArrayBuffer
  2. import scala.collection.mutable.ArrayBuffer
  3. scala> val b =ArrayBuffer[Int]()
  4. b: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer()
  5. scala> b+=1
  6. res0: b.
    type =ArrayBuffer(1)
  7. scala> b+=(1,2,3,4)
  8. res1: b.type =ArrayBuffer(1,1,2,3,4)
  9. scala> b++=Array(8,12,13)
  10. res2: b.type =ArrayBuffer(1,1,2,3,4,8,12,13)

當不知道Array最終需要裝多少元素,先構建一個數組緩衝,然後呼叫 b.toArray。 同理,a.toBuffer轉換成陣列緩衝。 
2. 遍歷陣列,until是RichInt的方法,返回所有小於但不包括上限的數字。0 until 10實際上是一個方法呼叫:

  1. 0.until(10)
  2. 0.until(s.
    length,2)//每兩個元素一跳

陣列轉換不會修改原陣列,而是產生一個新的陣列。

  1. scala> val a =Array(2,3,5,7,11)
  2. a:Array[Int]=Array(2,3,5,7,11)
  3. scala> val result =for(i <- a)yield i *2
  4. result:Array[Int]=Array(4,6,10,14,22)

代替守衛和yield的做法,以函式式方式新增條件操作:

  1. scala> a.filter(_ %2==0).map(2* _)//取偶數,乘以2
  2. res9:Array[Int]=Array(4)
  3. scala> val a1
    = a.filter(_ %2==0).map(2* _)
  4. a1:Array[Int]=Array(4)

示例:移出第一個負數之外的所有負數:(傳統做法是標記第一個負數)

  1. import scala.collection.mutable.ArrayBuffer
  2. objectExcept{
  3. def main(args:Array[String]){
  4. val intArray =ArrayBuffer(1,-8,10,-2,4,-1,3);
  5. var first =true
  6. var n = intArray.length
  7. var i =0
  8. while(i < n){
  9. if(intArray(i)>=0) i+=1
  10. else{
  11. if(first){ first =false; i+=1}
  12. else{ intArray.remove(i); n -=1}
  13. }
  14. }
  15. println(intArray)
  16. }
  17. }

另外,可以將非負數拷貝到前端即可:

  1. import scala.collection.mutable.ArrayBuffer
  2. objectExcept{
  3. def main(args:Array[String]){
  4. val intArray =ArrayBuffer(1,-8,10,-2,4,-1,3);
  5. var flag =true
  6. val index =for(i <-0until intArray.length if flag || intArray(i)>=0)yield{
  7. if(intArray(i)<0) flag =false;
  8. i
  9. }
  10. for(j <-0until index.length){
  11. intArray(j)= intArray(index(j))
  12. }
  13. intArray.trimEnd(intArray.length - index.length)
  14. println(intArray)
  15. }
  16. }
  1. 常用演算法
  1. Array(1,7,2,3).sum
  2. ArrayBuffer("Marry","had","a","lamb").max
  3. scala>import scala.collection.mutable.ArrayBuffer
  4. import scala.collection.mutable.ArrayBuffer
  5. scala> val b =ArrayBuffer(1,7,2,3)
  6. b: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer(1,7,2,3)
  7. val bSorted = b.sorted //b沒有被改變(這裡原書錯誤,見http://www.blogjava.net/sean/archive/2012/11/15/391386.html)
  8. scala> val bSorted = b.sortWith(_ > _)//錯誤見上
  9. bSorted: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer(7,3,2,1)
  1. scala> scala.util.Sorting.quickSort(b)
  2. scala> b
  3. res6:Array[Int]=Array(1,2,3,7)
  4. scala> b.mkString(" and ")
  5. res7:String=1and2and3and7
  6. scala> b.mkString("<",",",">")
  7. res8:String=<1,2,3,7>
  8. scala> b.toString //java的toString在這裡是毫無意義的
  9. res9:String=[[email protected]

二、習題答案

3.1 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0(包含)和n(不包含)之間

  1. import scala.util.Random
  2. import scala.math._
  3. def randomArray(n :Int):Array[Int]={
  4. val array =for(i<-0 to n)yieldRandom.nextInt(n)
  5. array.toArray
  6. }
  7. val result = randomArray(8)
  8. for(i <-0until result.length) println(result(i))

3.2 編寫一個迴圈,將整數陣列中相鄰的元素置換。例如,Array(1,2,3,4,5)經過置換後變為Array(2,1,4,3,5)

  1. defswitch(intArray:Array[Int]):Array[Int]={
  2. val t = intArray.toBuffer
  3. for(i <-0until(intArray.length,2)if i+1< t.length){
  4. val a = t(i)
  5. val b = t(i +1)
  6. t.remove(<