2017-04-08 69 views
-1

問題:等於的對象?

製作一個LandTract類,它有兩個字段:一個用於道的長度,另一個用於寬度。該類應該有一個返回該區域的方法,以及一個equals方法和一個toString方法。在程序中演示課程,要求用戶輸入兩片土地的尺寸。程序應該顯示每一片土地的面積,並指出這些土地是否大小相同。

LandTract類

public class LandTract { 

    private double width, 
      length; 

    public LandTract(double width, double length) { 
     this.width = width; 
     this.length = length; 
    } 

    public double getLength() { 
     return length; 
    } 

    public LandTract(double length) { 
     this.length = length; 
    } 


    public double tractArea(double width, double length) { 
     return width * length; 

    } 

    public String equal(LandTract zt, LandTract lt){ 

     String dec; 
     if(zt.equals(lt)){ 
      dec ="yes"; 
     }else dec="NO"; 

     return dec; 
    } 

    public String toString(){ 
     return "Area is " + width*length; 
    } 

} 

DemoTract類

import java.util.Scanner; 

public class DemoTract { 

    public static void main(String[] args) { 


     Scanner scan = new Scanner(System.in); 

     System.out.println("Please Enter First Tract Width"); 
     double width=scan.nextDouble(); 
     System.out.println("Please Eter First Trach Length ?"); 
     double length=scan.nextDouble(); 

     LandTract lt1 = new LandTract(width,length); 

     System.out.println("Please Enter Secont Tract Width"); 
     double width2=scan.nextDouble(); 
     System.out.println("Please Enter Secoinf Tract Length"); 
     double length2 = scan.nextDouble(); 

     LandTract lt2 = new LandTract(width2,length2); 

     System.out.println("First Tract " + lt1); 
     System.out.println("Secon Tract "+ lt2); 
     System.out.println(lt2.equal(lt1, lt2)); 






    } 


} 

對象等於永遠是假的,有什麼不對嗎?

+1

另外,tractArea不應該採取任何說法:它應該返回LandTract的區域。你的平等方法應該只有一個參數:它應該比較LandTract(即'this')與另一個。它應該返回一個布爾值,而不是一個字符串。最後,平等方法的要點是將'this'的寬度和高度與其他LandTract的寬度和高度進行比較。 equals()不會這樣做(嗯,如果你是averrode,那麼它會這樣做)。 –

+1

'LandTract'需要重寫'Object#equals(Object obj)',它返回'boolean'。目前'zt.equals(lt)'使用'Object'的'.equals(...)'方法,它只是檢查'LandTract' *引用*(不記得確切的詞)之間的相等性。 –

+0

你是什麼意思「同等大小」?尺寸必須相同,還是隻有區域?如果問題是檢查這些區域是否相等,那麼使用「equals」方法是不好的做法。只有當兩個對象的所有公共可用特性(通過某種定義)相同時,「equals」纔是真實的,並且這裏的長度是公開可用的。在這裏,我想你只需要'zt.tractArea()== lt.tractArea()',或者可以與一個epsilon進行比較以避免浮點精度問題。 – ajb

回答

1

爲了正確檢查對象的平等,你需要重寫從java.lang.Objectequals(Object obj)hashcode()方法來檢查對象的平等,如下圖所示:

public class LandTract { 

    //add your existing code here 

    @Override 
    public boolean equals(Object object){ 

     boolean areObjectsEqual = false; 

     if(object instanceof LandTract){ 
      LandTract landTract = (LandTract)object; 
      //check the condition on how this & passed objects are equal 
      if(this.width == landTract.width && this.length == landTract.length) { 
      areObjectsEqual = true; 
      } 
     } 
     return areObjectsEqual; 
    } 

    @Override 
    public int hashCode() { 
     return Double.valueOf(this.width+this.length).hashCode(); 
    } 
} 

在你main()方法,您現在可以檢查的平等使用這兩種方法equals()LandTrack對象如下圖所示:

System.out.println(lt1.equals(lt2)); 

一個更重要的這裏的一點是,當你正在使用doublewidthlength,您可能會遇到舍入問題(有關更多詳細信息,請參閱here),如果必須避免這些問題,則可能需要考慮使用BigDecimal

+0

這個問題在很多方面都是錯誤的,但我不禁要發表評論 - 你的解決方案不是很正確 - 如果這個區域可以是相同的話。this.width x this.length == landTract.width x landTract.length which並不意味着這兩個對象具有相同的值:-) – D00de

+0

另外,更改System.out.println(lt1.equals(lt1,lt2));到System.out.println(lt1.equals(lt2)); :-) – D00de

+0

很棒的地方,更新了 – developer