ivaneye.com

快学Scala习题解答—第六章 对象

对象

编写一个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() {}
}

快学Scala习题解答—第五章 类

改进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
   }
}

快学Scala习题解答—第四章 映射和元组

映射和元组

设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打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(","))

快学Scala习题解答—第三章 数组相关操作

数组相关操作

编写一段代码,将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(","))

快学Scala习题解答—第二章 控制结构和函数

控制结构和函数

一个数字如果为正数,则它的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的时候,应该能看到

BigInt(10).signum

一个空的快表达式{}的值是什么?类型是什么?

在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习题解答—第一章 基础

基础

在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