1. 程式人生 > >03 快學scala第三章習題答案

03 快學scala第三章習題答案

\1. 編寫一段程式碼,將a設定為一個n個隨機整數的陣列,要求隨機數介於0n之間。

1

2

3

4

5

6

7

8

9

10

11

12

objectApp

{

def main(args: Array[String]) {

    makeArr(10).foreach(println);

  }

def makeArr(n : Int) : Array[Int] = {

val a = new Array[Int](n);

val rand = new scala.util.Random();

for (i <- a) yield rand.nextInt(n);

  }                  

}

\2. 編寫一個迴圈,將整數陣列中相鄰的元素置換。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

objectApp

{

def main(args: Array[String]) {

val a = Array(1, 2, 3, 4, 5);

    revert(a);

    a.foreach(println);

  }

def revert(arr : Array[Int]) = {

for (i <- 0 until (arr.length - 1, 2)) {

val t = arr(i);

      arr(i) = arr(i + 1);

      arr(i + 1) = t;

    }

  }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

objectApp

{

def main(args: Array[String]) {

val a = Array(1, 2, 3, 4, 5);

val b = revertYield(a);

    b.foreach(println);

  }

def revertYield(arr : Array[Int]) = {

for (i <- 0 until arr.length) yield {

if (i < (arr.length - 1) && i % 2 == 0) {

val t = arr(i);

        arr(i) = arr(i + 1);

        arr(i + 1) = t;

      }

      arr(i);

    }

  }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import scala.collection.mutable.ArrayBuffer

objectApp

{

def main(args: Array[String]) {

val a = Array(1, -2, 0, -3, 0, 4, 5);

val b = sigNumArr(a);

    b.foreach(println);

  }

def sigNumArr(arr : Array[Int]) = {

val buf = new ArrayBuffer[Int]();

    buf ++= (for (i <- arr if i > 0) yield i)

    buf ++= (for (i <- arr if i == 0) yield i)

    buf ++= (for (i <- arr if i < 0) yield i)

    buf.toArray

  }

}

\5. 如何計算Array[Double]的平均值?

1

2

3

4

5

6

7

8

9

10

11

12

objectApp

{

def main(args: Array[String])  = {

val a = Array(1.0, -2.0, 0.0, -3.0, 0.0, 4.0, 5.0);

val b = avgArr(a);

    println(b)

  }

def avgArr(arr : Array[Double]) = {

    arr.sum / arr.length         

  }

}

\6. 如何重新組織Array[Int]的元素將它們反序排列?對於ArrayBuffer[Int]你又會怎麼做呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import scala.collection.mutable.ArrayBuffer

objectApp

{

def main(args: Array[String])  = {

val a = Array(1, -2, 0, -3, 0, 4, 5);

    revertArray(a);

    a.foreach(println)

// ArrayBuffer 反轉

val b = ArrayBuffer(1, -2, 0, -3, 0, 4, 5);

val c = ArrayBuffer[Int]()

    c ++= b.reverse

    c.foreach(println)

  } 

def revertArray(arr : Array[Int]) = {

for (i <- 0 until (arr.length % 2)) {

val t = arr(i);

      arr(i) = arr(arr.length - 1 - i);

      arr(arr.length - 1 - i) = t;

    }

  }

}

\7. 編寫一段程式碼,產出陣列中的所有值,去掉重複項。

1

2

3

4

5

6

7

8

9

10

11

12

import scala.collection.mutable.ArrayBuffer

objectApp

{

def main(args: Array[String])  = {

// ArrayBuffer 排重

val b = ArrayBuffer(1, -2, 0, -3, 0, 4, 5);

val c = ArrayBuffer[Int]()

    c ++= b.distinct

    c.foreach(println)

  }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import scala.collection.mutable.ArrayBuffer

objectApp

{

def main(args: Array[String])  = {

val b = Array(1, -2, 0, -3, 0, 4, 5);

val c = deleteUnFirstF(b)

    c.foreach(println)

  }

def deleteUnFirstF(arr : Array[Int]) = {

val indexes = (for (i <- 0 until arr.length if arr(i) < 0) yield i)

val rights  = indexes.reverse.dropRight(1)

val tmp = arr.toBuffer

for (index <- rights) tmp.remove(index)

    tmp

  }

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import scala.collection.mutable.ArrayBuffer

import scala.collection.JavaConversions.asScalaBuffer

object App

{

  def main(args: Array[String])  = {

    var c = timeZoneName()

    c.foreach(println)

  }       

  def timeZoneName() = {

    val arr = java.util.TimeZone.getAvailableIDs();

    val tmp = (for (i <- arr if i.startsWith("America/")) yield {

      i.drop("America/".length)

    })

    scala.util.Sorting.quickSort(tmp)

    tmp

  }

}

\10. 引入java.awt.datatransfer._並構建一個型別為SystemFlavorMap型別的物件,然後以DataFlavor.imageFlavor為引數呼叫getNativesForFlavor方法,以Scala緩衝儲存返回值。

1

2

3

4

5

6

7

8

9

10

11

12

import scala.collection.JavaConversions.asScalaBuffer

import scala.collection.mutable.Buffer

import java.awt.datatransfer._

object App

{

  def main(args: Array[String])  = {

     val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]

     val buf : Buffer[String] = flavors.getNativesForFlavor(DataFlavor.imageFlavor);

     buf.foreach(println);

  }

}