2011-12-07 7 views
1

私のクラスにequalsメソッドを実装しようとしています。 通知: '_data'プロパティはdouble[][]配列です。オブジェクト。Java:2つのdouble [] []配列を比較するequalsメソッドの実装

とにかくそれがコンパイルされ、すべてのものが、私は常に偽の答えを取得し、両方の配列が同じであるため、これはすることはできません。

oを私が何か間違ったことをやっていますか?他の簡単な方法はありますか? (唯一のオブジェクトクラスから等号を使用して!)

マイコード(JAVA):

public boolean equals(Object obj) { 
    if (!(obj instanceof MyClass)) { 
     return false; 
    } 

    MyClass myObj = (MyClass) obj; 
    return this._data.equals(myObj._data); 
} 
+0

大きなコードスニペットを貼り付ける必要があります。今は問題の原因を判断することは難しいです。 – soulcheck

+5

['java.util.Arrays.deepEquals()'](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html)を試しましたか? –

+0

デバッグのために、 'MyClass mc1 = new MyClass(); MyClass mc2 = mc1; boolean toCheck = mc1.equals(mc2); ' toCheck == true? –

答えて

0

私はあなたのMyClassクラスのequalsメソッドをオーバーライドします。

@Override 
public boolean equals(Object obj) {//if you insist in using an Object as argument instead of double[][] 
    if (!(obj instanceof MyClass)) { 
     return false; 
    } 

    MyClass myObj = (MyClass) obj; 
    if(_data.length == myObj._data.length){ 
     for(int i=0; i<_data.length; i++){ 
     if(_data[i].length == myObj._data[i].length){ 
      for(int j=0; j<_data[i].length; j++){ 
       if(_data[i][j] != myObj._data[i][j]){ 
        return false; 
       } 
      } 
     }else{ 
      return false; 
     } 
     } 
    }else{ 
     return false; 
    } 
    return true; 
} 

このコードでは、2次元配列はありますが、正方行列は使用できません。 N個の要素...例えば と27個の要素、第三行目と三つの要素、第二列とのすなわち最初の行、テストケース:

double[][] first= new double[5][3]; 
    double[][] second= new double[5][3]; 
    for(int i=0; i<first.length; i++){ 
     for(int j=0; j<first[i].length; j++){ 
      first[i][j] = 5; 
     } 
    } 
    for(int i=0; i<second.length; i++){ 
     for(int j=0; j<second[i].length; j++){ 
      second[i][j] = 5; 
     } 
    } 
    second[4][2] = 2; 

    MyClass c1 = new MyClass(first); 
    MyClass c2 = new MyClass(second); 

    System.out.println("Equals: "+c1.equals(c2)); 
5

使用Arrays.deepEquals(data, myObj._data)

+0

ありがとうが、私はequalsメソッドを使ってのみ尋ねた。(配列ではない。 – Popokoko

8

使用

Arrays.deepEquals(this._data, myObj._data) 

は、アレイ上の試験を行うために。

+0

ありがとう、私はequalsメソッドを使ってのみ尋ねました。(array.equals()ではありません) – Popokoko

+2

真剣に言えば、3人の人があなたに標準ライブラリに組み込まれている特定のやり方を教えてくれると、 "私はそれを使うことはできません"に基づいてそれに反対し、あなたは理由を正当化する必要があります。 –

+0

標準ライブラリを使用しない場合は、両方のディメンションでループ反復処理を行います。しかし、それは恐ろしいです。 –

0

ジョシュア・ブロックに等しいとhashCode(彼ら必見を実装する方法を説明します)を「有効なJava」のchapter 3に挿入してください。それはクラスのequalsをオーバーライドするために知っておく必要があるすべてを教えてください。

+0

私はこの問題は 'equals'の実装ではなく、' equals'メソッドがうまくいかない理由配列で! –

+0

OPのクラスでequalsをオーバーライドする方法について考えていたので、配列データメンバーを使って比較することができました。それは間違っていますか? "私は私のクラスでequalsメソッドを実装しようとしています..." - 理由については、equalsはオーバーライドされていないときにのみ "浅い等価"を実行します。 – duffymo

+0

彼のコメント "私はこれらの配列を 'equals'と比較することができるとかなり好意的だと考えているので、OPにとってはあまり明らかではないが、私は間違っている可能性がある。実際に私はそれが "浅い平等"よりも少ない*と考えています - 彼は単に参考文献を比較しています。 –

関連する問題