1. 程式人生 > >Scala練習五

Scala練習五

1. 改進Counter類,讓它不要在Int.MaxValue時變成負數

程式程式碼:

  1. class Counter {
  2. private var value=100
  3. def increment(){
  4. if(value<Int.MaxValue)
  5. value+=1
  6. else
  7. value
  8. }
  9. def current=value
  10. }
  11. object Counter{
  12. def main(args: Array[String]): Unit = {
  13. val max=Int.MaxValue
  14. println("Int型別的最大值:"+max)
  15. val counter=new Counter
  16. for(i <- 1 to (max))
  17. counter.increment()
  18. println("經過"+max+"增加後Value值為:"+counter.current)
  19. }
  20. }

執行結果:

Int型別的最大值:2147483647

經過2147483647增加後Value值為:2147483647

2. 編寫一個BankAccount類,加入deposit和withdraw方法,和一個只讀的balance屬性

程式程式碼:

  1. class BankAccount {
  2.   private var balance=0.0
  3.   def deposit(depamount:Double){
  4.     balance+=depamount
  5.   }
  6.   def withdraw(drawamount:Double){
  7.     balance-=drawamount
  8.   }
  9.   def current=balance
  10. }
  11. object BankAccount{
  12.   def main(args: Array[String]): Unit = {
  13.     val Drawamount=800
  14.     val Depamount=1000
  15.     val acc=new BankAccount
  16.     println("存入金額:"+Depamount)
  17.     acc.deposit(Depamount)
  18.     println("餘額:"+acc.current)
  19.     println("取出金額:"+Drawamount)
  20.     acc.withdraw(Drawamount)
  21.     println("餘額為:"+acc.current)
  22.   }
  23. }

執行結果:

存入金額:1000

餘額:1000.0

取出金額:800

餘額為:200.0

3. 編寫一個Time類,加入只讀屬性hours和minutes,和一個檢查某一時刻是否早於另一時刻的方法 before(other:Time):Boolean。Time物件應該以new Time(hrs,min)方式構建。其中hrs以軍用時間格式呈現(介於0和23之間)

程式程式碼:

  1. class Time(val hours:Int , val minutes:Int) {
  2.   def before(other:Time):Boolean={
  3.     hours<other.hours||(hours==other.hours&&minutes<other.minutes)
  4.   }
  5.   override def toString():String={
  6.     hours+":"+minutes
  7.   }
  8. }
  9. object Time{
  10.   def main(args: Array[String]): Unit = {
  11.     val t1=new Time(10,30)
  12.     val t2=new Time(10,50)
  13.     val t3=new Time(11,10)
  14.     println("t1時刻是:"+t1.toString())
  15.     println("t2時刻是:"+t2.toString())
  16.     println("t3時刻是:"+t3.toString())
  17.     println("t1時刻早於t2嗎:"+t1.before(t2))
  18.     println("t3時刻早於t2嗎:"+t3.before(t2))
  19.   }
  20. }

執行結果:

t1時刻是:10:30

t2時刻是:10:50

t3時刻是:11:10

t1時刻早於t2:true

t3時刻早於t2:false

4. 重新實現前一個類中的Time類,將內部呈現改成午夜起的分鐘數(介於0到24*60-1之間)。不要改變公有介面。也就是說,客戶端程式碼不應因你的修改而受影響

程式程式碼:

  1. class NewTime(val hours:Int,val minutes:Int) {
  2.   def before(other:NewTime):Boolean={
  3.     hours < other.hours||(hours==other.hours&&minutes<other.minutes)
  4.   }
  5.   override def toString():String={
  6.     hours*60+""+minutes
  7.   }
  8. }
  9. object NewTime{
  10.   def main(args: Array[String]): Unit = {
  11.       val t1=new NewTime(10,30)
  12.       val t2=new NewTime(10,50)
  13.       val t3=new NewTime(11,10)
  14.       println("t1時刻:"+t1.toString())
  15.       println("t2時刻:"+t2.toString())
  16.       println("t3時刻:"+t3.toString())
  17.       println("t1時刻比t2早嗎:"+t1.before(t2))
  18.       println("t3時刻比t2早嗎:"+t3.before(t2))
  19.   }
  20. }

執行結果:

t1時刻:60030

t2時刻:60050

t3時刻:66010

t1時刻比t2早嗎:true

t3時刻比t2早嗎:false

5. 建立一個Student類,加入可讀寫的JavaBeans屬性name(型別為String)和id(型別為Long)。有哪些方法被生產?你可以在Scala中呼叫JavaBeans的getter和setter方法嗎?應該這樣做嗎?

程式程式碼:

class Student {

var name:String=null

var id:Long=0

}

執行命令:javap -private Student

執行結果:

使用@BeanProperty增加相容JavaBean的get和set方法:

import scala.beans.BeanProperty

class Student {

@BeanProperty

var name:String=null

@BeanProperty

var id:Long=0

}

執行命令: javap -private Student

執行結果:

6. 在Person類中提供一個主構造器,將負年齡轉換為0

程式程式碼:

  1. class Person(var age:Int){
  2.   if(age < 0) age=0
  3. }
  4. object Person{
  5.   def main(args: Array[String]): Unit = {
  6.     val age1 = 10
  7.     val age2 = -20
  8.     println("將Tom的年齡初始化為:"+age1)
  9.     val Tom=new Person(age1)
  10.     println("Tom的實際年齡為:"+Tom.age)
  11.     println("將Tom的年齡初始化為:"+age2)
  12.     val Jhon=new Person(age2)
  13.     println("Jhon的實際年齡為:"+Jhon.age)
  14.   }
  15. }

執行結果:

Tom的年齡初始化為:10

Tom的實際年齡為:10

Jhon的年齡初始化為:-20

Jhon的實際年齡為:0

7. 編寫一個Person類,其主構造器接受一個字串,該字串包含名字,空格和姓名,如new Person("Fred Smith")。提供只讀屬性firstName和lastName。主構造器引數應該是var,val還是普通引數,為什麼

描述:name應該設定為val以防止被修改

程式程式碼:

  1. class Person(val name:String) {
  2.   private val namearr=name.split("")
  3.   def FirstName=namearr(0)
  4.   def LastName=namearr(1)
  5. }
  6. object Person{
  7.   def main(args: Array[String]): Unit = {
  8.     val person=new Person("Xinyu Jiang")
  9.     //name引數自動轉為私有欄位,並生成公有getter
  10.     println("person的名稱為:"+person.name)
  11.     println("person的FisrtName:"+person.FirstName)
  12.     println("person的LastName:"+person.LastName)
  13.   }
  14. }

執行結果:

person的名稱為:Xinyu Jiang

personFisrtName:Xinyu

personLastName:Jiang

8. 建立一個Car類,以只讀屬性對應制造商,型號名稱,型號年份以及一個可讀寫的屬性用於車牌。提供四組構造器。每個構造器都要求製造商和型號為必填。型號年份和車牌可選,如果未填,則型號年份為-1,車牌為空串。你會選擇哪一個作為你的主構造器,為什麼

程式程式碼:

  1. class Car(val manufactor:String,val model:String=null,val year:String=null,var number:Int= -1){
  2. }
  3. object Car{
  4.   def main(args: Array[String]): Unit = {
  5.     val Chevrolet=new Car("通用","雪佛蘭-愛唯歐")
  6.     val Volkswagen=new Car("一汽","大眾-斯柯達","2015-1-1")
  7.     val Volvo=new Car("吉利","Volvo-s40","2015-1-2",666666)
  8.     val nameArr=Array("雪佛蘭","大眾","沃爾沃")
  9.     val carArr=Array(Chevrolet,Volkswagen,Volvo)
  10.     Outinfo(nameArr,carArr)
  11.   }
  12.   def Outinfo(carName:Array[String],carArr:Array[Car])={
  13.     for(i <- 0 until carName.length){
  14.       println(carName(i))
  15.       println("汽車製造商為: "+carArr(i).manufactor)
  16.       println("汽車型號為: "+carArr(i).model)
  17.       println("汽車產年份為: "+carArr(i).year)
  18.       println("汽車車牌號為: "+carArr(i).number)
  19.     }
  20.   }
  21. }

執行結果:

雪佛蘭

汽車製造商為通用

汽車型號為雪佛蘭-愛唯歐

汽車產年份為: null

汽車車牌號為: -1

大眾

汽車製造商為一汽

汽車型號為大眾-斯柯達

汽車產年份為: 2015-1-1

汽車車牌號為: -1

沃爾沃

汽車製造商為吉利

汽車型號為: Volvo-s40

汽車產年份為: 2015-1-2

汽車車牌號為: 666666

9. 在Java,C#或C++重做前一個練習。Scala相比之下精簡多少

程式程式碼:

  1. class JavaCar{
  2.    private String manufactor;
  3.    private String model;
  4.    private String year;
  5.    private int number;
  6.    public JavaCar(){}
  7.    public JavaCar(String manufactor,String model){
  8.       this.manufactor=manufactor;
  9.       this.model=model;
  10.       this.year=null;
  11.       this.number=-1;
  12.    }
  13.    public JavaCar(String manufactor,String model,String year){
  14.       this.manufactor=manufactor;
  15.       this.model=model;
  16.       this.year=year;
  17.       this.number=-1;
  18.    }
  19.    public JavaCar(String manufactor,String model,String year,int number){
  20.       this.manufactor=manufactor;
  21.       this.model=model;
  22.       this.year=year;
  23.       this.number=number;
  24.    }
  25.    public String getManufactor(){
  26.       return this.manufactor;
  27.    }
  28.    public String getModel(){
  29.       return this.model;
  30.    }
  31.    public String getYear(){
  32.       return this.year;
  33.    }
  34.    public void setNumber(int number){
  35.       this.number=number;
  36.    }
  37.    public int getNumber(){
  38.       return number;
  39.    }
  40.    public static void main(String[] args) {
  41.    }
  42. }
  43. public class CarTest{
  44.    public static void main(String[] args) {
  45.       JavaCar Chevrolet=new JavaCar("通用","雪佛蘭-愛唯歐");
  46.       JavaCar Volkswagen=new JavaCar("一汽","大眾-斯柯達","2015-1-1");
  47.       JavaCar Volvo=new JavaCar("吉利","Volvo-S40","2015-1-2",66666);
  48.       String[] nameArr={"雪佛蘭","大眾","沃爾沃"};
  49.       JavaCar[] carinfoArr={Chevrolet,Volkswagen,Volvo};
  50.       CarTest cartest=new CarTest();
  51.       cartest.OutInfo(nameArr,carinfoArr);
  52.    }
  53.    public void OutInfo(String[] nameArr,JavaCar[] carinfoArr){
  54.       for(int i=0;i<nameArr.length;i++){
  55.          System.out.println(nameArr[i]);
  56.          System.out.println("汽車製造商"+carinfoArr[i].getManufactor());
  57.          System.out.println("汽車型號"+carinfoArr[i].getModel());
  58.          System.out.println("汽車年份"+carinfoArr[i].getYear());
  59.          System.out.print("車牌號"+carinfoArr[i].getNumber());
  60.       }
  61.    }
  62. }

執行結果:

雪佛蘭

汽車製造商通用

汽車型號雪佛蘭-愛唯歐

汽車年份: null

車牌號: -1

大眾

汽車製造商一汽

汽車型號大眾-斯柯達

汽車年份: 2015-1-1

車牌號: -1

沃爾沃

汽車製造商吉利

汽車型號: Volvo-S40

汽車年份: 2015-1-2

車牌號: 66666

10. 考慮如下的類 
class Employ(val name:String,var salary:Double){ 
    def this(){ this ("John Q. Public",0.0) } 

重寫該類,使用顯示的欄位定義,和一個預設主構造器。你更傾向於使用哪種形式,為什麼

程式程式碼:

  1. class Employee(var name:String,var salary:Double){
  2.   def this(){
  3.     this("Jom Q. Public",0)
  4.   }
  5. }
  6. object Employee{
  7.   def main(args: Array[String]): Unit = {
  8.     val ITemployee=new Employee
  9.     val Bankemployee=new Employee("Tom Hanks",100000)
  10.     println("ITemployee Name: "+ITemployee.name+" Salary: "+ITemployee.salary)
  11.     println("Bankemployee Name: "+Bankemployee.name+" Salary: "+Bankemployee.salary)
  12.   }
  13. }

執行結果:

ITemployee Name: Jom Q. Public Salary: 0.0

Bankemployee Name: Tom Hanks Salary: 100000.0