对象
编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法
object Conversions{
def inchesToCentimeters(){}
def gallonsToLiters(){}
def milesToKilometers(){}
}
前一个练习不是很面向对象。提供一个通用的超类UnitConversion并定义扩展该超类的InchesToCentimeters,GallonsToLiters和MilesToKilometers对象
abstract class UnitConversion{
def inchesToCentimeters(){}
def gallonsToLiters(){}
def milesToKilometers(){}
}
object InchesToCentimeters extends UnitConversion{
override def inchesToCentimeters() {}
}
object GallonsToLiters extends UnitConversion{
override def gallonsToLiters() {}
}
object MilesToKilometers extends UnitConversion{
override def milesToKilometers() {}
}
类
改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数
加个判断就OK了
class Count{
private var value = Int.MaxValue
def increment(){if(value < Int.MaxValue) value + 1 else value }
def current = value
}
编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性
class BankAccount(val balance:Int = 0){
def deposit(){}
def withdraw(){}
}
编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)
class Time(val hours:Int,val minutes:Int){
def before(other:Time):Boolean={
hours < other.hours || (hours == other.hours && minutes < other.minutes)
}
override def toString():String={
hours + " : " + minutes
}
}
映射和元组
设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折
映射的简单操作
scala> val map = Map("book"->10,"gun"->18,"ipad"->1000)
map: scala.collection.immutable.Map[java.lang.String,Int] = Map(book -> 10, gun -> 18, ipad -> 1000)
scala> for((k,v) <- map) yield (k,v * 0.9)
res3: scala.collection.immutable.Map[java.lang.String,Double] = Map(book -> 9.0, gun -> 16.2, ipad -> 900.0)
编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用java.util.Scanner:
val in = new java.util.Scanner(new java.io.File("myfile.txt"))
while(in.hasNext()) 处理 in.next() 或者翻到第9章看看更Scala的做法。
最后,打印出所有单词和它们出现的次数。
@<p>当然使用Scala的方法啦。参考第9章@</p>
首先,创建一个文件myfile.txt。输入如下内容
test test ttt test ttt t test sss s
Scala代码如下
import scala.io.Source
import scala.collection.mutable.HashMap
//val source = Source.fromFile("myfile.txt")
//val tokens = source.mkString.split("\\s+") //此写法tokens为空,不知为何
val source = Source.fromFile("myfile.txt").mkString
val tokens = source.split("\\s+")
val map = new HashMap[String,Int]
for(key <- tokens){
map(key) = map.getOrElse(key,0) + 1
}
println(map.mkString(","))
数组相关操作
编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间
random和yield的使用
import scala.math.random
def randomArray(n:Int)={
for(i <- 0 until n) yield (random * n).toInt
}
println(randomArray(10).mkString(","))
编写一个循环,将整数数组中相邻的元素置换。例如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)
对数组方法的使用
def reorderArray(arr:Array[Int]):Array[Int]={
val t = arr.toBuffer
for(i <- 1 until (t.length,2);tmp = t(i);j <- i - 1 until i){
t(i) = t(j)
t(j) = tmp
}
t.toArray
}
println(reorderArray(Array(1,2,3,4,5)).mkString(","))
控制结构和函数
一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值
简单的逻辑判断
def signum(num:Int){if(num>0)print(1)else if(num<0)print(-1)else print(0)}
Scala中已经有此方法了,刚才查找API的时候,应该能看到
一个空的快表达式{}的值是什么?类型是什么?
在REPL中就能看出来了
scala> val t = {}
t: Unit = ()
可以看出,它的值是()类型是Unit
指出在Scala中何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)
题目已经给了明确的提示了。本章节中已经说过了,在scala中的赋值语句是Unit类型。所以只要x为Unit类型就可以了。
scala> var y=4;
y: Int = 4
scala> var x={}
x: Unit = ()
scala> x=y=7
x: Unit = ()
这也再次证明了{}是Unit类型
基础
在Scala REPL中键入3,然后按Tab键。有哪些方法可以被应用?
这个。。。。直接操作一遍就有结果了.此题不知是翻译的问题,还是原题的问题,在Scala
REPL中需要按3. 然后按Tab才会提示。 直接按3加Tab是没有提示的。下面是结果
!= ## % & * +
- / < << <= ==
> >= >> >>> ^ asInstanceOf
equals getClass hashCode isInstanceOf toByte toChar
toDouble toFloat toInt toLong toShort toString
unary_+ unary_- unary_~ |
列出的方法并不全,需要查询全部方法还是需要到Scaladoc中的Int,Double,RichInt,RichDouble等类中去查看。
在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?(提示:res变量是你的朋友)
依次进行计算即可
scala> scala.math.sqrt(3)
warning: there were 1 deprecation warnings; re-run with -deprecation for details
res5: Double = 1.7320508075688772
scala> res5*res5
res6: Double = 2.9999999999999996
scala> 3 - res6
res7: Double = 4.440892098500626E-16