scala小練習二
1.編寫一個Person類,其主構造器接受一個字串,該字串包含名字,空格和姓,如new
Person(“Fred Smith”)。提供只讀屬性 firstName 和 lastName。主構造器引數應該是var, val
還是普通引數。
class Person(val name:String) {
val firstNmae:String=name.split(" ")(0)
val lastNmae:String=name.split(" ")(1)
}
2.+3. 編寫一個Time類,加入只讀屬性hours和minutes,和一個檢查某一時刻是否早於另一時刻
的方法before(other:Time):Boolean。Time物件應該以new Time(hrs,min)方式構建。其中hrs以
軍用時間格式呈現(介於0和23之間)
重新實現前一個類中的Time類,將內部呈現改成午夜起的分鐘數(介於0到24*60-1之間)。不
要改變公有介面。也就是說,客戶端程式碼不應因你的修改而受影響。
class Time(val hours:Int,val minute:Int) {
//引數型別是必須指定的,val或var不必須顯示指定
def before(other: Time): Boolean ={
hours<other.hours||hours==other.hours&&minute<other.minute
}
//實現1
def time(): String ={
hours+":"+minute
}
//實現2
// def time(): String ={
// (hours*60+minute).toString
//}
}
4.定義抽象類Animal,在抽象類中定義抽象方法animal 和 sound,並定義templateMethod
方法,在這個方法中直接呼叫animal 和sound 方法是否合理?定義兩種實現類,實現Animal,
修改Animal 和它的子類,使其還能表示動物都吃什麼。所編寫的程式碼需要滿足如下測試
abstract class Animal {
def animal:String
def sound:String
def templateMethod=s"$animal $sound"
}
abstract class Animaleat extends Animal{
def eat:String
override def templateMethod=s"$animal food is $eat"
//抽象方法override可以省略,非抽象方法override必須寫
}
class Duck extends Animaleat{
override def animal: String = "Duck"
def eat:String="plant"
override def sound: String = "Quack"
}
class Cow extends Animaleat{
override def animal: String = "Cow"
def eat:String="grass"
override def sound: String = "Moo"
5.自己設計一套特質,要求體現疊加在一起的特質,設計具體的抽象方法抽象欄位
class SmartPhone extends Phone with Camera with Video{//疊加特質
val player="CD"
override def watch(): Unit = {
println(s"watch video $player")
}
def func(): Unit ={
photograph()
watch()
call()
}
}
trait Camera{
val photoNum:Int=100//具體欄位
def photograph(): Unit ={//具體方法
println(s"take photo $photoNum")
}
}
trait Video{
val player:String//抽象欄位
def watch()
}
class Phone{
def call(): Unit ={
println("make a call")//抽象方法
}
}
6.建立trait BatteryPower 來報告剩餘電量。如果電量多餘40%,那麼報告“green”;如果在
20%~39% 之間 那麼報告yellow;如果少於20%,那麼報告”red”。例項化該程式碼滿足下列測
試: class Battery extends EnergySource with BatteryPower
class Battery extends EnergySource with BatteryPower{
def monitor: String = super.monitor(energy)
}
class EnergySource{
var energy:Int=0
}
trait BatteryPower{
def monitor(percentage:Int): String ={
if(percentage<20) "red"
else if(percentage>=40) "green"
else "yellow"
}
}
7.通過把 scala.math.Ordered[Point] 混入 java.awt.Point 的方式,定義 OrderedPoint 類,
按照詞典的編輯方式排序,也就是說,如果x < x 或者 x = x
或者 y < y則(x, y) < (x’y
)
import java.awt.Point
import scala.util.Random
class OrderedPoint(x:Int,y:Int) extends Point(x:Int,y:Int) with Ordered[Point]{
override def compare(that: Point): Int = {
if(this.y>that.y) 1
else if (this.y<that.y) -1
else 0
if(this.x>that.x) 1
else if (this.x<that.x) -1
else 0
}
}
object TestOrderPoint{
def main(args: Array[String]): Unit = {
//用隨機數測試
val array:Array[OrderedPoint]=new Array[OrderedPoint](5)
for (i <- 0 to array.length-1){
array(i)=new OrderedPoint((new Random()).nextInt(10),(new Random).nextInt(10))
}
array.foreach(println)
println(" ")
val res=array.sortWith(_ > _)
// sortWith(lt: (A, A) ⇒ Boolean): List[A]
//使用自定義的比較函式進行排序,比較函式在boolean部分
// val res2=res.sortWith(_ .compare(_)>0)//降序
// val res3=res.sortWith((s,t)=>s.compare(t)>0)
res.foreach(println)
}
}
8.檢視BitSet 類,將它所有的超類和特質繪製成一張圖,忽略型別引數([…] 中的內容)。然後給
出該特質的線性化規格說明。
BitSetLike, SortedSet, SortedSetLike, Sorted, Set, SetLike, Subtractable, GenSet, GenericSetTemplate, GenSetLike, Iterable, IterableLike, Equals, GenIterable, GenIterableLike, Traversable, GenTraversable, GenericTraversableTemplate, TraversableLike, GenTraversableLike, Parallelizable, ParSet, TraversableOnce, GenTraversableOnce, FilterMonadic, HasNewBuilder, (Int) ⇒ Boolean, AnyRef, Any