2017-04-08 15 views
-1

質問:小道の長さと幅の2つのフィールドを持つLandTractクラスを作成します。クラスには、tractの領域を返すメソッドと、equalsメソッドとtoStringメソッドが必要です。 2つの地域の面積を入力するようにプログラムに指示します。プログラムは、各土地の面積を表示し、その土地の面積が等しいかどうかを示す必要があります。同じオブジェクトの均等性?

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')を別のものと比較することになっています。また、Stringではなくブール値を返す必要があります。最後に、等しい方法のポイントは、 'this'の幅と高さを他のLandTractの幅と高さと比較することです。 equals()はそれをしません(あなたが平均化されていれば、そうするでしょう)。 –

+1

'LandTract'は' boolean'を返す 'Object#equals(Object obj)'をオーバーライドする必要があります。現在、 'zt.equals(lt)'は、 'LandTract' *参照(正確な用語を覚えることはできません)の間の等価性をチェックしている' Object'の '.equals(...)'メソッドを使用しています。 –

+0

「等しいサイズ」とはどういう意味ですか?寸法は同じでなければならないのですか?領域が等しいかどうかを確認することが問題であれば、それに対して 'equals'メソッドを使うのは良いことではありません。 'equals'は、2つのオブジェクトの公に利用可能な特性(何らかの定義による)がすべて同じである場合にのみ真となり、ここで長さは公に利用可能です。ここでは、単純に 'zt.tractArea()== lt.tractArea()'がほしいと思う、あるいは浮動小数点精度の問題を避けるためにイプシロンと比較するかもしれません。 – ajb

答えて

1

適切にオブジェクトの等価性をチェックするために、あなたは以下に示すように、オブジェクトの平等をチェックするjava.lang.Objectからequals(Object obj)hashcode()メソッドオーバーライドする必要があります:あなたのmain()方法で

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(); 
    } 
} 

を、あなたは今の平等を確認することができます以下に示すようにequals()方法を使用してLandTrackオブジェクトの両方:ここ

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

もう一つ重要な点として、あなたが012を使用していることですのwidthlengthの場合、丸めの問題(詳細はhereと表示されます)が発生し、問題を回避する必要がある場合はBigDecimalを使用することを検討する必要があります。

+0

問題は非常に多くの点で間違っていますが、私はコメントすることはできません - あなたの解決策はあまり正確ではありません - this.width x this.length == landTract.width x landTract.lengthこの属性が両方のオブジェクトで同じ値を持つことを意味しません: – D00de

+0

また、System.out.println(lt1.equals(lt1、lt2)); System.out.println(lt1.equals(lt2))へ; :-) – D00de

+0

素晴らしいスポット、更新 – developer