2011-11-30 6 views
22

含まれています。 私は、そのリストにオブジェクトのフィールドでオブジェクトが含まれているかどうかをチェックできます。たとえば :のArrayListのカスタムは、私は、これらのオブジェクトのいくつかのオブジェクト</p> <pre><code>class A { private Long id; private String name; public boolean equals(Long v) { return this.id.equals(v); } } </code></pre> <p>とのArrayListを持っている方法

ArrayList<A> list = new ArrayList<A>(); if (list.contains(0L)) {...} 

が、オーバーライドは方法が私を助けていません等しいです。私が間違っていることは何ですか? はあなた

UPDATE に感謝し、私もハッシュコード()メソッドをオーバーライドする必要がありますか?

+0

Aクラスでequals()をオーバーライドしましたか?もしそうなら、あなたはここに投稿できますか? – c05mic

+0

以下の答えで判断すると、これに便利な解決法はないと思います。独自のComparatorでCollections.sort()を呼び出すときに使用するような、匿名のクラス実装でこれを解決できるようになりました。 – kodu

+0

もう少し検索したところ、いくつかの便利な答えが見つかりました:http://stackoverflow.com/questions/587404/finding-all-objects-that-have-a-given-property-inside-a-collection – kodu

答えて

38

がここにそれがうまくいく方法を示すかもしれないいくつかのコードです:

import java.util.ArrayList; 

class A { 
    private Long id; 
    private String name; 

    A(Long id){ 
     this.id = id; 
    } 

    @Override 
    public boolean equals(Object v) { 
     boolean retVal = false; 

     if (v instanceof A){ 
      A ptr = (A) v; 
      retVal = ptr.id.longValue() == this.id; 
     } 

    return retVal; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0); 
     return hash; 
    } 
} 

public class ArrayList_recap { 
    public static void main(String[] args) { 
     ArrayList<A> list = new ArrayList<A>(); 

     list.add(new A(0L)); 
     list.add(new A(1L)); 

     if (list.contains(new A(0L))) 
     { 
      System.out.println("Equal"); 
     } 
     else 
     { 
      System.out.println("Nah."); 
     }  
    } 

} 

まず、等号(オブジェクトo)メソッドのオーバーライドがあります。次に、hashCode()のオーバーライドもあります。また、equalsのinstanceof Aチェックは、異なるオブジェクトを比較しようとしていないことを保証します。

これはトリックを行う必要があります!それが助けて欲しい!乾杯:

+0

いい例ありがとう! –

+0

containsAllメソッドでも動作しますか? – Amriteya

+0

これはcontainsAllのために働きます – Amriteya

8

クラスのメソッドをオーバーライドしていません。オーバーライドするには、メソッドのパラメータも同じ型でなければなりません。

それはあなたがおそらく私が間違っているのは何本

public boolean equals(Object o) 
    { 
     if (o == null) return false; 
     if (o == this) return true; //if both pointing towards same object on heap 

      A a = (A) o; 
     return this.id.equals(a.id); 
    } 
+0

更新しましたそのコードは同じですが、結果は同じです。特定のIDを持つオブジェクトが見つからない場合 – nKognito

+0

関連するコードを投稿してください。 – Zohaib

+1

可能性のある説明については私の答えを見てください - * "その他の問題..." * –

7

を行う必要があり、それは

public boolean equals(Long o) { 

} 

であるあなたの場合のように

public boolean equals(Object o) { 

} 

すべきですか?

オーバーライドしていません。あなたは過負荷です。

containsメソッドは、equals(Object)という名前のequalsメソッドを呼び出します。このため、この(新しい)メソッドは呼び出されません。

もう1つの問題は、の場合、equalsメソッドのセマンティクスが正しくないことです。 containsメソッドは、thisと、リストのメンバーになる可能性のあるオブジェクトを比較する必要があります。あなたのリストにはLong個のオブジェクトが含まれていません。これには、タイプAのオブジェクトが含まれています。

生のリストタイプを使用している場合は、これで逃げるかもしれませんが、API契約の違反や悪い習慣です。より良い解決策は、リストの要素を明示的に反復してテストすることです。


そして、私はあまりにもハッシュコード()メソッドをオーバーライドする必要がありますか?あなたがequals(Object)を上書き場合

あなたもhashcode()をオーバーライドする必要があります。

ここでは違いはありませんが、Aオブジェクトをハッシュ化されたデータ構造に入れることは不可欠です。次の人があなたのコードで何をするのか分からないので、equals(Object)hashCode()に互換性のあるセマンティクスがあることを確認することをお勧めします。

+0

説明ありがとう – nKognito

関連する問題

 関連する問題