快學scala習題(七)-----包

1.編寫示例程序展示爲什麼
package com.horseman.impatient不同於
package com
package horseman
package impatient

第一種方式中,T3可以訪問T1,T2類
package com{
    class T1{

    }
    package horseman{
      class T2{

      }
      package impatient{
        class T3(t1:T1,t2:T2){

        }
      }
    }
}
第二種方式則訪問不了
package com.horseman.impatient{
  class T4(t3:T1){

  }
}

2.編寫一個令人困惑的scala 代碼,使用一個不再頂部的com包,需要注意的是包的引入可以在程序的任意位置,並且引入最上級的包並不能使用子包中元素

package com{
    class T1{

    }
    package horseman{
      class T2{

      }
      package impatient{
        class T3(t1:T1,t2:T2){

        }
      }
    }
}
import com._;
class TT(t2:T1){

}

3.編寫一個包random,加入函數nextInt():Int,nextDouble():Double 和 SetSeed(seed:Int):Unit,生成隨機數的算法採用線性同餘生成器
線性同餘生成器算法如下
Nj+1= (A * Nj + B ) mod M
將seed當做首值,A,B,M均爲固定值,這裏取A= 1664525,B=1013904223,n = 2的32次方

package random{
package object random{
    val A=math.BigDecimal(1664525);
    val b=math.BigDecimal(101304223);
    val M=math.BigDecimal(2).pow(32);
    var lastvalue=0;
    def nextInt():Int={
      val ranInt=((lastvalue *A+b)%M).toInt;
      lastvalue=ranInt;
      lastvalue;
    }
    def SetSeed(seed:Int){
      this.lastvalue=seed;
    }
    def nextDouble():Double={
       val ranDouble=((lastvalue *A+b)%M);
       lastvalue=ranDouble.toInt;
       ranDouble.toDouble;
    }

}
}
object packageTest extends App {
  override def main(args:Array[String]){
    import random._;
     random.SetSeed(111);
     println(random.nextInt());
     println(random.nextInt());
     println(random.nextDouble());
     println(random.nextDouble());
  }

}

4.在你看來scala設計者爲什麼要提供package object而不是簡單的將函數和變量添加到包中

因爲java的虛擬機不支持。。。。

5.private[com] def giveRaise(rate: Double)的含義是什麼?有用嗎?

此方法僅在com包中可見,有用,可以定義包的可見性

6.編寫一段程序,將java哈希映射中的所有元素拷貝到scala哈希映射。用引入語句重命名這兩個類。

import java.util.{HashMap => javaHashMap}
import scala.collection.mutable.HashMap;

object packageTest extends App {
  override def main(args:Array[String]){
    import random._;
     random.SetSeed(111);
     println(random.nextInt());
     println(random.nextInt());
     println(random.nextDouble());
     println(random.nextDouble());
     val map:javaHashMap[String,Int]=new javaHashMap[String,Int]();
     map.put("zacks",1);
     map.put("cloud",2);
     map.put("tifa",3);
     val setmap=JavaCopyToScalaHashMap(map);
     setmap.foreach(println)
  }
  def JavaCopyToScalaHashMap(map:javaHashMap[String,Int]):HashMap[String,Int]={
    var setmap=new HashMap[String,Int]();
    for(key<- map.keySet().toArray()){
      setmap+=(key.toString() -> map.get(key));
    }

    setmap;
  }

7.在前一個練習中將所有引入語句引入到儘可能小的作用域裏
大致就是在需要用到的地方引用,引用語句在任何地方都可以使用

3.import java.util.{HashMap => JavaHashMap}  
4.  
5.  val map = new JavaHashMap[String,String]()  
6.  map.put("1","a")  
7.  map.put("2","b")  
8.  map.put("3","c")  
9.  
10.  import scala.collection.mutable.HashMap  
11.  
12.  val smap = new HashMap[String,String]()  
13.  
14.  for(key <- map.keySet().toArray){  
15.    smap += (key.toString -> map.get(key))  
16.  }  
17.  
18.  println(smap.mkString)  

8.以下代碼的作用是什麼?這是個好主意嗎?
import java._
import javax._

作用是引入java,javax包下的所有內容,但java和javax下並沒有任何類,所以此語句並沒有啥卵用

9.編寫一段程序,引入java.lang.System類,從user.name系統屬性讀取用戶名,從Console對象讀取一個密碼,如果密碼不是”secret”,則在標準錯誤流中打印一個消息;如果密碼是”secret”,則在標準輸出流中打印一個問候消息。不要使用任何其他引入,也不要使用任何限定詞(帶句點的那種)

  val Map:scala.collection.Map[String,String]=System.getProperties();
     Map.foreach((f:(String,String)) => if(f._1=="user.name") println(f._2));
     val passwd=Console.readLine();
     if(passwd=="secret"){
       println("welcome back"+Map.get("user.name"));
     }else{
       System.err.println("passwd error");
     }

10.除了StringBuilder,還有那些java.lang的成員被scala所包含
直接比對java.lang下的類和scala包下的類即可 ,這裏不一一列舉了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章