第一章 基础
1 在REPL模式下输入 3.
然后按tab键。有哪些方法可以被应用?
答: [root@bigdata01 bin]# sh scala
Welcome to Scala 2.13.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help.
scala> 3.
!= << abs getClass isValidByte min toByte toOctalString
% <= byteValue intValue isValidChar round tochar toradians
& == ceil isFinite isValidInt self todegrees toShort
* > compare isInfinite isValidLong shortValue todouble unary_+
+ >= compareto isInfinity isValidShort sign toFloat unary_-
- >> doubleValue isNaN isWhole signum toHexString unary_~
/ >>> floatValue isNegInfinity longValue to toInt until
< ^ floor isPosInfinity max toBinaryString toLong |
2 在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?(提示:res变量是你的朋友)
答:scala> math.sqrt(3)
res2: Double = 1.7320508075688772
scala> math.pow(res2,2)
res3: Double = 2.9999999999999996
scala> 3-res3
res4: Double = 4.440892098500626E-16
3 res变量是val还是var?
答:res是val的,val是不可变变量,var是可变变量
scala> math.pow(16,2)
res1: Double = 256.0
scala> res1 = 16
^
error: reassignment to val
4 Scala允许你用数字去乘字符串—去REPL中试一下"crazy"*3。这个操作做什么?在Scaladoc中如何找到这个操作?
答:scala> "crazy"*3
res2: String = crazycrazycrazy
scala> 3*"crazy"
^
error: overloaded method value * with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (String)
从以上结果看,“crazy”作为字符串,有方法*,如下:
scala> "crazy". (TAB键)
* count isEmpty reduceOption tapEach
+ diff isTraversableAgain reduceRight to
……
这个操作是吧“crazy”这个字符串复制3次并连接输出,Scaladoc中查找StringOps结果见图1-1右侧
5 10 max 2的含义是什么?max方法定义在哪个类中?
答:scala> 10 max 2
res5: Int = 10
根据执行结果可以看出,返回结果为两个数中最大的那个;
max方法存在于RichInt中。10的类型是Int,调 用前首先被转换成RichInt。
scala> 10.max(2)
res7: Int = 10
6 用BigInt计算2的1024次方
答:直接调用math会导致数据溢出
scala> math.pow(2,1024)
res8: Double = Infinity
使用BigInt转换,结果如下:
scala> BigInt(2).pow(1024)
res9: scala.math.BigInt = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
7 为了在使用probablePrime(100,Random)获取随机素数时不在probablePrime和Radom之前使用任何限定符,你需要引入什么?
答: 直接执行如下:
scala> probablePrime(100,Random)
^
error: not found: value probablePrime
^
error: not found: value Random
需要导入相关联的包
scala> import scala.math.BigInt._
import scala.math.BigInt._
scala> import scala.util.Random
import scala.util.Random
scala>
scala> probablePrime(99,Random)
res14: scala.math.BigInt = 488641816499616907294665725959
8 创建随机文件的方式之一是生成一个随机的BigInt,然后将它转换成三十六进制,输出类似"qsnvbevtomcj38o06kul"这样的字符串。查阅Scaladoc,找到在Scala中实现该逻辑的办法。
答:通过Scaladoc文档,查找到
scala> probablePrime(99,Random)
res17: scala.math.BigInt = 536562710848253983747999915807
scala> res17.toString(36)
res18: String = 1g0qprkfd94f32v2i3a7
9 在Scala中如何获取字符串的首字符和尾字符?
答:head是获取第一个字符,last是获取最后一个,tail是获取第一个后剩下的。
scala> val str = "crazy"
str: String = crazy
scala> str.head
res20: Char = c
scala> str.tail
res21: String = razy
scala> str.last
res22: Char = y
10 take,drop,takeRight和dropRight这些字符串函数是做什么用的?和substring相比,他们的优点和缺点都是哪些?
答: take是从字符串开始,获取字符;
drop是从字符串开始,丢弃字符,输出剩下的;
takeRight是从字符串结尾开始获取字符;
dropRight是从字符串结尾开始丢掉字符后,取剩下的;
scala> val str = "ScalaDoc"
str: String = ScalaDoc
scala> str.take(0)
res23: String = ""
scala> str.take(1)
res24: String = S
scala> str.take(4)
res25: String = Scal
scala> str.drop(4)
res26: String = aDoc
scala> str.takeRight(4)
res27: String = aDoc
scala> str.dropRight(4)
res28: String = Scal
substring可以取某个区间的字符串,如下:
scala> str.substring(2,5)
res33: String = ala
第二章 控制结构和函数
1 如果一个数字为正数,则它的signum为1;如果是负数,则signum为-1;如果是0,则signum是0。编写一个函数来计算这个值。
答:scala> def test(num:Int):Int={
| if(num>0) 1 else if(num<0) -1 else 0
| }
test: (num: Int)Int
scala> test(10)
res34: Int = 1
scala> test(-10)
res35: Int = -1
scala> test(0)
res36: Int = 0
2 一个空的块表达式的值是什么?它的类型是什么
答:值是(),类型是Unit
3 指出Scala何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)
答:Scala的赋值语句的返回值是Unit
,只要x和y是Unit
类型,这么 x=y=1就是合法的
4 针对下列java循环编写一个scala版:for(int i=10;i>=0;i--)System.out.println(i)
答:scala> for(i<-10 to (0,-1)) println(i)
5 编写一个过程countdown(n:Int),打印从n到0的数字。
答 要考虑n大于0和小于0的情况
def countdown(n:Int)={
if(n>0) for(i<-n to (0,-1)) println(i)
else for(i<-n to 0) println(i)
}
6 编写一个for循环,计算字符串中所有字母的unicode代码的乘积。举例来说,"Hello"中所有字母的字符成为9415087488L。
答:def calcul(str:String):Long={
var result:Long = 1
for(i<-0 to str.length-1) result = str(i).toLong*result
result
}
scala> calcul("Hello")
res58: BigInt = 9415087488
7 同样是解决前一个练习的问题,但这次不使用循环(提示,在Scaladoc中查看StringOps)
答:def calcul (str:String): Long = {
var result: Long = 1
result = str.map(_.toLong).product
result
}
scala> calcul("Hello")
res0: Long = 9415087488
8 编写一个函数product(s: String)函数,计算前面练习中提到的乘积。
答:参见第七题
答:def calcul(str:String):Long={
if(str.length <0) 0
else if (str.length == 1) str.head.toLong
else (str.head.toLong * calcul(str.tail))
}
scala> calcul("Hello")
res1: Long = 9415087488
10 编写函数计算xn
,其中n是整数,使用如下的递归定义:※ xn
=y* y,如果n是正偶数的话,这里的y = xn∕2。※ xn
=x*xn-1,如果n是正奇数的话。※ x0
= 1※ xn=1/x-n
,如果n是负数的话。不得使用return语句。
答:def calcul(x: Double,n:Int):BigDecimal={
if(n==0) {1}
else if(n<0) {1/calcul(x,(-1 * n))}
else if(n%2==1) {x*calcul(x,n-1)}
else {calcul(x,n/2)*calcul(x,n/2)}
}
11 定义一个名为date的字符串插值器,通过这样一个插值器,你可以以date"$year-$month-$day"的形式来定义java.time.localDate。你需要定义一个带有date方法的“隐式”类,就像这样:
implicit class DateInterpolator(val sc:StringContext)extends AnyVal{
def date(args:Any*):LocalDate=...
}
args(i)是第i个表达式的值。将每个表达式转换成字符串,然后再转换成整数,并传递给LocalDate.of方法。如果你已经会一些Scala,就再加上错误处理逻辑。如果没有三个入参,或者入参不是整数,或者它们不是以破折号隔开的,则抛出异常。(你可以用sc.parts来获取表达式之间的字符串。)
答:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。