快學Scala習題解答—第三章 數組相關操作

[size=large][b]4 數組相關操作[/b][/size]
[b]4.1 編寫一段代碼,將a設置爲一個n個隨機整數的數組,要求隨機數介於0(包含)和n(不包含)之間[/b]
random和yield的使用
import scala.math.random

def randomArray(n:Int)={
for(i <- 0 until n) yield (random * n).toInt
}

println(randomArray(10).mkString(","))


[b]4.2 編寫一個循環,將整數數組中相鄰的元素置換。例如,Array(1,2,3,4,5)經過置換後變爲Array(2,1,4,3,5)[/b]
對數組方法的使用
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(","))


[b]4.3 重複前一個練習,不過這一次生成一個新的值交換過的數組。用for/yield[/b]
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(","))

[b]
4.4 給定一個整數數組,產生一個新的數組,包含元數組中的所有正值,以原有順序排列,之後的元素是所有零或負值,以原有順序排列[/b]
//使用循環
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
}
//使用filter
def reorderArray(arr:Array[Int]):Array[Int]={
val a = arr.filter(_ > 0).map(1 * _)
val b = arr.filter(_ <= 0).map(1 * _)
val c = a.toBuffer
c ++= b
c.toArray
}


[b]4.5 如何計算Array[Double]的平均值?[/b]
def aveArray(arr:Array[Double]):Double={
arr.sum/arr.length
}


[b]4.6 如何重新組織Array[Int]的元素將他們以反序排列?對於ArrayBuffer[Int]你又會怎麼做呢?[/b]
def reverseArray(arr:Array[Int]):Array[Int]={
arr.reverse
}


[b]4.7 編寫一段代碼,產出數組中的所有值,去掉重複項。(提示:查看Scaladoc)
產出數組的代碼就不編寫了。去重只需要調用api即可[/b]
def distinctArray(arr:Array[Int]):Array[Int]={
val t = arr.toBuffer
t.distinct.toArray
}


[b]4.8 重新編寫3.4節結尾的示例。收集負值元素的下標,反序,去掉最後一個下標,然後對每個下標調用a.remove(i)。比較這樣做的效率和3.4節中另外兩種方法的效率[/b]
性能嘛,自己比較吧!
def removeArray(arr:Array[Int]):Array[Int]={
val t = arr.toBuffer
val idx = ArrayBuffer[Int]()
for(i <- 0 until t.length){
if(t(i) < 0)idx += i
}
idx.remove(0)
idx.reverse
idx.foreach(t.remove(_))
t.toArray
}


[b]4.9 創建一個由java.util.TimeZone.getAvailableIDs返回ide時區集合,判斷條件是它們在美洲。去掉"America/"前綴並排序[/b]
顯示的都是中文時間,後續的過濾無法操作。只列出所有的時區
val t = for(i <- getAvailableIDs) yield
getTimeZone(i).getDisplayName()


[b]4.10 引入java.awt.datatransfer.並構建一個類型爲SystemFlavorMap類型的對象:
val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap] 然後以DataFlavor.imageFlavor爲參數調用getNativesForFlavor方法,以Scala緩衝保存返回值。 (爲什麼用這樣一個晦澀難懂的類?因爲在Java標準庫中很難找到使用java.util.List的代碼)[/b]
val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
println(flavors.getNativesForFlavor(DataFlavor.imageFlavor).toArray.toBuffer.mkString(" | ")


[b]Blog URL:[/b][url]http://www.ivanpig.com/blog/?p=46[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章