1. 程式人生 > >scala小練習二

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