快學Scala習題解答—第三章 陣列相關操作
阿新 • • 發佈:2018-12-25
3 陣列相關操作
3.1 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0(包含)和n(不包含)之間
random和yield的使用
Scala程式碼
3.2 編寫一個迴圈,將整數陣列中相鄰的元素置換。例如,Array(1,2,3,4,5)經過置換後變為Array(2,1,4,3,5)
對陣列方法的使用
Scala程式碼
3.3 重複前一個練習,不過這一次生成一個新的值交換過的陣列。用for/yield
Scala程式碼
3.4 給定一個整數陣列,產生一個新的陣列,包含元陣列中的所有正值,以原有順序排列,之後的元素是所有零或負值,以原有順序排列
Scala程式碼
3.5 如何計算Array[Double]的平均值?
Scala程式碼
3.6 如何重新組織Array[Int]的元素將他們以反序排列?對於ArrayBuffer[Int]你又會怎麼做呢?
Scala程式碼
3.7 編寫一段程式碼,產出陣列中的所有值,去掉重複項。(提示:檢視Scaladoc)
產出陣列的程式碼就不編寫了。去重只需要呼叫api即可
Scala程式碼
Scala程式碼
3.1 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0(包含)和n(不包含)之間
random和yield的使用
Scala程式碼
- import scala.math.random
- def randomArray(n:Int)={
- for(i <- 0 until n) yield (random * n).toInt
- }
- println(randomArray(10).mkString(","))
3.2 編寫一個迴圈,將整數陣列中相鄰的元素置換。例如,Array(1,2,3,4,5)經過置換後變為Array(2,1,4,3,5)
對陣列方法的使用
Scala程式碼
- def reorderArray(arr:Array[Int]):Array[Int]={
- val t = arr.toBuffer
- for(i <- 1 until (t.length,2);tmp = t(i);j <- i - 1 until i){
- t(i) = t(j)
- t(j) = tmp
- }
- t.toArray
- }
- println(reorderArray(Array(1,2,3,4,5)).mkString(","))
3.3 重複前一個練習,不過這一次生成一個新的值交換過的陣列。用for/yield
Scala程式碼
- def reorderArray(arr:Array[Int]):Array[Int]={
- (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
- }
- println(reorderArray(Array(1,2,3,4,5)).mkString(","))
3.4 給定一個整數陣列,產生一個新的陣列,包含元陣列中的所有正值,以原有順序排列,之後的元素是所有零或負值,以原有順序排列
Scala程式碼
- //使用迴圈
- def reorderArray(arr:Array[Int]):Array[Int]={
- val a = ArrayBuffer[Int]()
- val b = ArrayBuffer[Int]()
- arr.foreach(arg => if(arg > 0) a += arg else b += arg)
- a ++= b
- a.toArray
- }
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程式碼
- def aveArray(arr:Array[Double]):Double={
- arr.sum/arr.length
- }
3.6 如何重新組織Array[Int]的元素將他們以反序排列?對於ArrayBuffer[Int]你又會怎麼做呢?
Scala程式碼
- def reverseArray(arr:Array[Int]):Array[Int]={
- arr.reverse
- }
3.7 編寫一段程式碼,產出陣列中的所有值,去掉重複項。(提示:檢視Scaladoc)
產出陣列的程式碼就不編寫了。去重只需要呼叫api即可
Scala程式碼
- def distinctArray(arr:Array[Int]):Array[Int]={
- val t = arr.toBuffer
- t.distinct.toArray
- }
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程式碼
- val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
- println(flavors.getNativesForFlavor(DataFlavor.imageFlavor).toArray.toBuffer.mkString(" | ")