1. 程式人生 > >快學Scala習題解答—第三章 陣列相關操作

快學Scala習題解答—第三章 陣列相關操作

3 陣列相關操作
3.1 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0(包含)和n(不包含)之間
random和yield的使用 
Scala程式碼  收藏程式碼
  1. import scala.math.random  
  2. def randomArray(n:Int)={  
  3.   for(i <- 0 until n) yield (random * n).toInt  
  4. }  
  5. println(randomArray(10).mkString(","))  


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

對陣列方法的使用 
Scala程式碼  收藏程式碼
  1. def reorderArray(arr:Array[Int]):Array[Int]={  
  2.   val t = arr.toBuffer  
  3.   for(i <- 1 until (t.length,2);tmp = t(i);j <- i - 1 until i){  
  4.     t(i) = t(j)  
  5.     t(j) = tmp  
  6.   }  
  7.   t.toArray  
  8. }  
  9. println(reorderArray(Array(1,2,3,4,5)).mkString(","))  


3.3 重複前一個練習,不過這一次生成一個新的值交換過的陣列。用for/yield

Scala程式碼  收藏程式碼
  1. def reorderArray(arr:Array[Int]):Array[Int]={  
  2.   (for(i <- 0 until (arr.length,2)) yield if (i + 1 < arr.length) Array(arr(i + 1),arr(i)) else Array(arr(i))).flatten.toArray  
  3. }  
  4. println(reorderArray(Array(1,2,3,4,5)).mkString(","))  


3.4 給定一個整數陣列,產生一個新的陣列,包含元陣列中的所有正值,以原有順序排列,之後的元素是所有零或負值,以原有順序排列

Scala程式碼  收藏程式碼
  1. //使用迴圈  
  2.  def reorderArray(arr:Array[Int]):Array[Int]={  
  3.      val a = ArrayBuffer[Int]()  
  4.      val b = ArrayBuffer[Int]()  
  5.      arr.foreach(arg => if(arg > 0) a += arg else b += arg)  
  6.      a ++= b  
  7.      a.toArray  
  8.  }  
    val a = Array(1,3,-3,-5,-7,3,2)
    def reorderArray(arr: Array[Int]) = {
      val  b = arr.filter(_ > 0)
      val  c = arr.filter(_ <= 0)
      val newarr = b ++ c
      print(newarr.toBuffer.toString())
    }
      reorderArray(a)


3.5 如何計算Array[Double]的平均值?
Scala程式碼  收藏程式碼
  1. def aveArray(arr:Array[Double]):Double={  
  2.   arr.sum/arr.length  
  3. }  


3.6 如何重新組織Array[Int]的元素將他們以反序排列?對於ArrayBuffer[Int]你又會怎麼做呢?
Scala程式碼  收藏程式碼
  1. def reverseArray(arr:Array[Int]):Array[Int]={  
  2.   arr.reverse  
  3. }  


3.7 編寫一段程式碼,產出陣列中的所有值,去掉重複項。(提示:檢視Scaladoc) 
產出陣列的程式碼就不編寫了。去重只需要呼叫api即可

Scala程式碼  收藏程式碼
  1. def distinctArray(arr:Array[Int]):Array[Int]={  
  2.   val t = arr.toBuffer  
  3.   t.distinct.toArray  
  4. }  


3.8 重新編寫3.4節結尾的示例。收集負值元素的下標,反序,去掉最後一個下標,然後對每個下標呼叫a.remove(i)。比較這樣做的效率和3.4節中另外兩種方法的效率

   def removeArray(array: Array[Int]){
      val t = array.toBuffer
      val index = for (i <- 0 until array.length if array(i) < 0) yield i
      val right = index.reverse.dropRight(1)
      right.foreach(t.remove(_))
      print(t)
    }
    
    val a = Array(1,3,-3,-5,-7,3,2,1)
    removeArray(a)


3.9 建立一個由java.util.TimeZone.getAvailableIDs返回ide時區集合,判斷條件是它們在美洲。去掉"America/"字首並排序

 val americaTimeZone = java.util.TimeZone.getAvailableIDs
val americatimezone = java.util.TimeZone.getAvailableIDs.filter(_.take(8)=="America/")
val sortedamericaTimeZone = americaTimeZone.map(_.drop(8)).sorted

3.10 引入java.awt.datatransfer.並構建一個型別為SystemFlavorMap型別的物件: 

val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap] 然後以DataFlavor.imageFlavor為引數呼叫getNativesForFlavor方法,以Scala緩衝儲存返回值。 (為什麼用這樣一個晦澀難懂的類?因為在Java標準庫中很難找到使用java.util.List的程式碼)
Scala程式碼  收藏程式碼
  1. val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]  
  2. println(flavors.getNativesForFlavor(DataFlavor.imageFlavor).toArray.toBuffer.mkString(" | ")