scala小练习二

这篇博客涵盖了Scala编程的一些基础和进阶练习,包括创建Person类以处理名字和姓氏,实现Time类的比较方法,设计抽象类Animal及其子类,探索特质的叠加,创建报告电池电量的BatteryPower trait,以及实现OrderedPoint类以支持按字典顺序排序。此外,还讨论了BitSet类的继承结构和线性化规格。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值