イテレータ内のxの2つのインスタンスの値を比較しようとしています。
xは、独自のデータメンバーを含む参照型です。xのインスタンスを別のインスタンスと比較して、それぞれの内部の値が同じかどうかを判断しようとしています。
if(x.equals(x))
xの各インスタンスの値が実際に異なる場合、trueと評価され続けます。
乾杯。
コードが実際にはこのように見えないと仮定すると
X x = new X();
if(x.equals(x))
しかし、もっと好き
X x = new X();
X y = new X();
if(x.equals(y)) { }
x.equals(y)
そして、equals の実装が壊れているため、間違った値を取得しています。
あなたに行き、Class X
equals がどのように実装されているかを確認してください。Xで実装されていない場合はスーパークラスでチェック。
これは、与えられた詳細で答えるのが難しい質問です。.equalsメソッドを使用するには、プリミティブではなくオブジェクトである必要があります。では、equalsメソッドは、誤った比較が行われる原因となる方法でオーバーライドされていますか?それは私が見ている場所でしょう。
データではなく参照を比較しているようです。
編集:オブジェクトのAPIドキュメントから: "クラスObjectのequalsメソッドは、オブジェクトに対して可能な限り最も識別可能な同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xおよびyは同じオブジェクトを参照します(x == yの値はtrueです)。 "
たとえば、「X」またはその親クラスがequalsをオーバーライドしない場合、equalsを呼び出すと、参照が比較されます。これらが同じオブジェクトである場合、常にequalになります。
その音によって、クラス'X'のequalsメソッドをオーバーライドする必要がありますが、繰り返しになりますが、あなたの言うことは、それらがとにかく同じ参照であることを示しているようです。
クラス内のequals
メソッドはObject
、instance-equals操作を実行します。ただし、のサブクラスがObject
このメソッドをオーバーライドして相対等しい操作を実行することは一般的です。この場合、ターゲットオブジェクト内の値は、問題のオブジェクトの値に対してテストされます。あなたの場合、メソッドObject
をオーバーライドしたサブクラスを使用している可能性がありますequals
。equals
クラスのメソッドがどのようにX
実装されているかを知っておくとよいでしょう。
2 つの X オブジェクトは実際には異なるオブジェクトであり、誤って同じオブジェクトではないと仮定します。この場合、問題はそのクラスの equals() 実装です。クラスとそのスーパークラスで equals() の実装を確認し、実際にインテリジェントに比較していることを確認してください。必要に応じて、独自に記述してください。
class Square
{
public int length;
public boolean equals( Square s )
{
return this.length == s.length;
}
}
equals( )をオーバーライドする場合は、 hashcode()もオーバーライドします。