快學scala 第三章 讀書筆記及習題答案程式碼
阿新 • • 發佈:2018-12-25
chapter 3 陣列相關操作
標籤:快學scala
一、筆記
- scala的Array以java陣列方式實現,陣列在JVM中的型別為java.lang.String[].
scala>import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val b =ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer()
scala> b+=1
res0: b.
scala> b+=(1,2,3,4)
res1: b.type =ArrayBuffer(1,1,2,3,4)
scala> b++=Array(8,12,13)
res2: b.type =ArrayBuffer(1,1,2,3,4,8,12,13)
當不知道Array最終需要裝多少元素,先構建一個數組緩衝,然後呼叫 b.toArray。 同理,a.toBuffer轉換成陣列緩衝。
2. 遍歷陣列,until是RichInt的方法,返回所有小於但不包括上限的數字。0 until 10實際上是一個方法呼叫:
0.until(10)
0.until(s.
陣列轉換不會修改原陣列,而是產生一個新的陣列。
scala> val a =Array(2,3,5,7,11)
a:Array[Int]=Array(2,3,5,7,11)
scala> val result =for(i <- a)yield i *2
result:Array[Int]=Array(4,6,10,14,22)
代替守衛和yield的做法,以函式式方式新增條件操作:
scala> a.filter(_ %2==0).map(2* _)//取偶數,乘以2
res9:Array[Int]=Array(4)
scala> val a1
a1:Array[Int]=Array(4)
示例:移出第一個負數之外的所有負數:(傳統做法是標記第一個負數)
import scala.collection.mutable.ArrayBuffer
objectExcept{
def main(args:Array[String]){
val intArray =ArrayBuffer(1,-8,10,-2,4,-1,3);
var first =true
var n = intArray.length
var i =0
while(i < n){
if(intArray(i)>=0) i+=1
else{
if(first){ first =false; i+=1}
else{ intArray.remove(i); n -=1}
}
}
println(intArray)
}
}
另外,可以將非負數拷貝到前端即可:
import scala.collection.mutable.ArrayBuffer
objectExcept{
def main(args:Array[String]){
val intArray =ArrayBuffer(1,-8,10,-2,4,-1,3);
var flag =true
val index =for(i <-0until intArray.length if flag || intArray(i)>=0)yield{
if(intArray(i)<0) flag =false;
i
}
for(j <-0until index.length){
intArray(j)= intArray(index(j))
}
intArray.trimEnd(intArray.length - index.length)
println(intArray)
}
}
- 常用演算法
Array(1,7,2,3).sum
ArrayBuffer("Marry","had","a","lamb").max
scala>import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val b =ArrayBuffer(1,7,2,3)
b: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer(1,7,2,3)
val bSorted = b.sorted //b沒有被改變(這裡原書錯誤,見http://www.blogjava.net/sean/archive/2012/11/15/391386.html)
scala> val bSorted = b.sortWith(_ > _)//錯誤見上
bSorted: scala.collection.mutable.ArrayBuffer[Int]=ArrayBuffer(7,3,2,1)
scala> scala.util.Sorting.quickSort(b)
scala> b
res6:Array[Int]=Array(1,2,3,7)
scala> b.mkString(" and ")
res7:String=1and2and3and7
scala> b.mkString("<",",",">")
res8:String=<1,2,3,7>
scala> b.toString //java的toString在這裡是毫無意義的
res9:String=[[email protected]
二、習題答案
3.1 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0(包含)和n(不包含)之間
import scala.util.Random
import scala.math._
def randomArray(n :Int):Array[Int]={
val array =for(i<-0 to n)yieldRandom.nextInt(n)
array.toArray
}
val result = randomArray(8)
for(i <-0until result.length) println(result(i))
3.2 編寫一個迴圈,將整數陣列中相鄰的元素置換。例如,Array(1,2,3,4,5)經過置換後變為Array(2,1,4,3,5)
defswitch(intArray:Array[Int]):Array[Int]={
val t = intArray.toBuffer
for(i <-0until(intArray.length,2)if i+1< t.length){
val a = t(i)
val b = t(i +1)
t.remove(<