快学scala习题(七)-----包

来源:互联网 发布:js给div设置id 编辑:程序博客网 时间:2024/06/02 21:02

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包下的类即可 ,这里不一一列举了

0 0