Scala学习(七)练习
|
控制结构和函数 |
1. 编写示例程序,展示为什么
package com.horstmann.impatient
不同于
package com
package horstmann
package impatient
描述: 区别是后者的上层包也可见,而串写的只有当前包范围可见
程序代码: b.scala
- package com{
- package horstmann{
- object A{
- def hi=println("I am A")
- }
- package impatient{
- object B extends App{
- def hi=A.hi
- hi
- }
- }
- }
- }
运行结果:
E:\Test>scalac b.scala
E:\Test>scala com.horstmann.impatient.B
I am A
E:\Test>
程序代码: c.scala
package com.horstmann.impatient{
object C extends App{
B.hi
A.hi
}
}
运行结果:
E:\Test>scalac c.scala
c.scala:4: error: not found: value A
A.hi
^
one error found
E:\Test>
编译时找不到A,说明串联声明时不包含上级声明
程序代码: d.scala
E:\Test>scalac d.scala
E:\Test>scala com.horstmann.impatient.C
I am A
I am A
E:\Test>
2. 编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包
程序代码: a1.scala
package com {
package horstmann {
package com {
package horstmann {
object A {
def hi = println("I am the Ghost A")
}
}
}
}
}
程序代码: a2.scala
package com {
package horstmann {
object A {
def hi =println("I am A")
}
package impatient {
object B extends App {
def hi = com.horstmann.A.hi
hi
}
}
}
}
先编译a2.scala再编译a1.scala运行结果如下:
E:\Test>scalac a2.scala
E:\Test>scalac a1.scala
E:\Test>scala com.horstmann.impatient.B
I am A
E:\Test>
先编译a1.scala再编译a1.scala运行结果如下:
E:\Test>scalac a1.scala
E:\Test>scalac a2.scala
E:\Test>scala com.horstmann.impatient.B
I am the Ghost A
E:\Test>
3. 编写一个包random,加入函数nextlnt(): Int、nextDouble(): Double和setSeed(seed : Int): Unit。生成随机数的算法采用线性同余生成器:
后值 =(前值×a+b)mod 2n
其中,a = 1664525,b =1013904223,n =32,前值的初始值为seed。
程序代码:
- package random{
- object Random {
- private val a = 1664525
- private val b = 1013904223
- private val n = 32
- private var seed=0
- private var follow:BigInt=0
- private var previous:BigInt=0
- def nextInt():Int={
- follow=(previous*a+b)%BigInt(math.pow(2, n).toLong)
- previous=follow
- (follow%Int.MaxValue).intValue()
- }
- def nextDouble():Double={
- nextInt.toDouble
- }
- def setSeed(newSeed:Int){
- seed=newSeed
- previous=seed
- }
- }
- }
- object Test extends App{
- var r =random.Random
- r.setSeed(args(0).toInt)
- for(i <- 1 to 10) println(r.nextInt())
- for(i <- 1 to 10) println(r.nextDouble())
- }
运行结果:
E:\Test>scalac Random.scala
E:\Test>scala Test 0
1013904223
1196435762
1372387050
720982837
1649599747
523159175
1476291629
601448361
33406696
351317787
1.27442629E9
1.020336477E9
4.8889166E8
1.654060783E9
2.8987765E7
6.3353937E7
8.92205936E8
1.338634754E9
1.649346937E9
6.21388933E8
E:\Test>
4. 在你看来,Scala的设计者为什么要提供package object法而不是简单地让你将函数和变量添加到包中呢
直接加函数和变量声明到包中,比如com.a.b.c。这样就跟c下面的的class或者object差 了一个层级。他们实际上是c下面的所有类的共同的上级定义。这样一来就没有了封装性。 而实现上来说估计也比较麻烦。
5. private[com] def giveRaise(rate: Double)的含义是什么,有用吗
该函数在com包下可见,可以扩大函数的可见范围
6. 编写一段程序,将Java哈希映射中的所有元素拷贝到Scala哈希映射。用引入语句重命名这两个类
程序代码:
- import java.util.{HashMap=>JHashMap}
- import scala.collection.mutable.HashMap
- object JavaMap {
- def transMapValues(javaMap:JHashMap[Any,Any]):HashMap[Any,Any]={
- val result=new HashMap[Any,Any]
- for(k <- javaMap.keySet().toArray()){
- result+=k->javaMap.get(k)
- }
- result
- }
- def main(args: Array[String]): Unit = {
- val jmap:JHashMap[Any,Any]=new JHashMap[Any,Any]
- var smap=new HashMap[Any,Any]
- for(i <- 1 to 9)
- jmap.put(i,"JavaMap"+i)
- smap=transMapValues(jmap)
- smap.foreach(println)
- }
- }
运行结果:
(8,JavaMap8)
(2,JavaMap2)
(5,JavaMap5)
(4,JavaMap4)
(7,JavaMap7)
(1,JavaMap1)
(9,JavaMap9)
(3,JavaMap3)
(6,JavaMap6)
7. 在前一个练习中,将所有引入语句移动到尽可能小的作用域里
描述:import可以放到任何区域,直接放到对象结构体当中,也没有问题
程序代码:
- object JavaMap {
- import java.util.{HashMap=>JHashMap}
- import scala.collection.mutable.HashMap
- def transMapValues(javaMap:JHashMap[Any,Any]):HashMap[Any,Any]={
- val result=new HashMap[Any,Any]
- for(k <- javaMap.keySet().toArray()){
- result+=k->javaMap.get(k)
- }
- result
- }
- def main(args: Array[String]): Unit = {
- val jmap:JHashMap[Any,Any]=new JHashMap[Any,Any]
- var smap=new HashMap[Any,Any]
- for(i <- 1 to 10)
- jmap.put(i,"JavaMap"+i)
- smap=transMapValues(jmap)
- smap.foreach(println)
- }
- }
8. 以下代码的作用是什么,这是个好主意吗
import java._
import javax._
引入了java和javax的所有内容。因为Scala会自动覆盖java的同名类,不会有冲突。即使这样,引入过多的包,也会让人很迷惑。况且scala编译就已经够慢的了
9. 编写一段程序,引人java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如果密码不是" secret",则在标准错误流中打印一个消息;如果密码是" secret",则在标准输出流中打印一个问候消息。不要使用任其他引入,也不要使用任何限定词,即带句点的那种
程序代码:
- object Sys{
- import scala.io.StdIn
- import java.lang.System._
- def main(args: Array[String]): Unit = {
- val pass=StdIn.readLine()
- if(pass=="secret"){
- val name=getProperty("user.name")
- out.printf("Greetings,%s!",name)
- }else{
- err.println("error")
- }
- }
- }
运行结果:
secret
Greetings,hadoop!
10. 除了StringBuilder,还有那些java.lang的成员是被scala包覆盖的
Console,Math, 还有基本类型包装对象,Long,Double,Char,Short等等都被Scala覆盖了。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Scala学习(七)练习的更多相关文章
- Scala学习七——包和引入
一.本章要点 包也可也可以像内部类那样嵌套 包路径不是绝对路径 包声明链x.y.z并不自动将中间包x和x.y变成可见 位于文件顶部不带花括号的包声明在整个文件范围内有效 包对象可以持有函数和变量 引入 ...
- Scala学习(七)---包和引入
包和引入 摘要: 在本篇中,你将会了解到Scala中的包和引入语句是如何工作的.相比Java不论是包还是引入都更加符合常规,也更灵活一些.本篇的要点包括: 1. 包也可以像内部类那样嵌套 2. 包路径 ...
- Scala学习资源
Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...
- 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习
下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...
- MyBatis学习七:spring和MyBatis整合
<\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...
- 机器学习(三)--- scala学习笔记
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...
- SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- 【Scala】Scala学习资料
Scala学习资料 java 树形 分类器_百度搜索 决策树分类器-Java实现 - CSDN博客 KNN分类器-Java实现 - CSDN博客 学习:java设计模式—分类 - 飞翔荷兰人 - 博客 ...
- Scala学习网址
scala学习网址为:https://twitter.github.io/scala_school/zh_cn https://www.zhihu.com/question/26707124
随机推荐
- TensorFlow实现Softmax回归(模型存储与加载)
# -*- coding: utf-8 -*- """ Created on Thu Oct 18 18:02:26 2018 @author: zhen "& ...
- 移除元素的golang实现
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- GC Ergonomics间接引发的锁等待超时问题排查分析
1. 问题背景 上周线上某模块出现锁等待超时,如下图所示: 我虽然不是该模块负责人,但出于好奇,也一起帮忙排查定位问题. 这里的业务背景就是在执行到某个地方时,需要去表中插入一批数据,这批数据需要根据 ...
- C#接口的显隐实现
显示接口实现与隐式接口实现 何为显式接口实现.隐式接口实现?简单概括,使用接口名作为方法名的前缀,这称为“显式接口实现”:传统的实现方式,称为“隐式接口实现”.下面给个例子. IChineseGree ...
- mysql3
一数据类型二约束条件一数据类型: 1 数字(默认都是有符号,宽度指的是显示宽度,与存储无关(只是int)) tinyint int bigint:个数,年龄,id,qq号,手机号 float:价格,身 ...
- centos7下安装docker(13.3volume生命周期管理)
本章讨论:volume的备份,恢复,迁移和销毁 1.备份 通过前面的大量的实验,我们知道volume 是依赖host存在的,是host中的文件或目录,所以volume 的备份实际是对文件系统的备份. ...
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES)
windows下,以上两个错误的解决方法 工具/原料 windows 8 MySql 方法/步骤 找到配置文件my.ini ,然后将其打开,可以选择用记事本打开 打开后,搜索mysq ...
- 【转】MySQL 当记录不存在时insert,当记录存在时update
MySQL当记录不存在时insert,当记录存在时更新:网上基本有三种解决方法 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句 ...
- Codeforces Round #553 (Div. 2) D. Stas and the Queue at the Buffet 贪心+公式转化
题意 给出n个pair (a,b) 把它放在线性序列上 1--n 上 使得 sum(a*(j-1)+b*(n-j)) 最小 思路 :对式子进行合并 同类项 有: j*(a-b)+ (-a+ ...
- activemq5.14+zookeeper3.4.9实现高可用
一.activeMQ主要的几类部署方式比较1.默认的单机部署(kahadb)activeMQ的默认存储的单机方式,以本地kahadb文件的方式存储,所以性能指标完全依赖本地磁盘IO,不能提供高可用. ...