快學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包下的類即可 ,這裡不一一列舉了