2012-02-11 16 views
2
public ClassA 
{ 
private String firstId; 
private String secondId; 

public void setFirstId(String firstId) { 
      this.firstId = firstId; 
    } 


    public String getFirstId() { 
      return id; 
    } 

    public void setSecondId(String secondId) { 
      this.secondId = secondId; 
    } 


    public String getSecondId() { 
      return secondId; 
    } 
} 



public ClassB 
{ 
private String firstId; 
private String secondId; 


    public void setFirstId(String firstId) { 
      this.firstId = firstId; 
    } 


    public String getFirstId() { 
      return id; 
    } 

    public void setSecondId(String secondId) { 
      this.secondId = secondId; 
    } 

    public String getSecondId() { 
      return secondId; 
    } 
} 

は、私は私は2つの配列リストに追加しています(もちろんの名前を除いて)全く同じです上記2クラス(POJOを)持っています。私は2つのオブジェクトが同じかどうか比較する必要があります。それらが同じであれば、別のリスト(commonList)に追加する必要があり、別のリスト(differentList)に追加する必要があります。私は、次のコードを書かれている:オブジェクト比較:aListAとaListB:JAVA

ClassA clsA = null; 
public ArrayList genCommonList(aList, bList) 
{ 

for(int i = 1; i<aList.size(); i++) 
{ 
clsA = new ClassA; 
Object obj = aList.get(i); 
clsA = (ClassA)obj; 
if(bList.contains(clsA) 
{ 
genCommonList.add(clsA); 
} 
} 

public ArrayList genDifferentList(aList, bList) 
{ 

for(int i = 1; i<aList.size(); i++) 
{ 
clsA = new ClassA; 
Object obj = aList.get(i); 
clsA = (ClassA)obj; 
if(!bList.contains(clsA) 
{ 
genDifferentList.add(clsA); 
} 
} 

私の問題は、2つの異なるのPOJOのデータ(両方の変数、firstIdとsecondID)が同じであっても、彼らは別のリストに入れてしてしまうことがあります。つまり、ArrayListクラスのcontains()メソッドを使用して、オブジェクトの平等性が比較されていないことを意味します。 POJO内の各変数からデータを取得して比較したいとは思っていません。両方の変数のPOJOを比較し、等しいかどうかを判断する方法はありますか?

+1

どうしても2つの異なるクラスがあるのはなぜですか? –

答えて

1

イベントの内容は同じですが、それらは同じ条件を満たしていない別のオブジェクトです。 iteratingによって明示的なa.getfirstId()。equals(b.getfirsId())とa.getscondID()。equals(b.getSecondId())を行う必要があるかもしれません。

他の可能性は、両方のPOJOクラスでequalsメソッドとhashcodeメソッドをオーバーライドする可能性があります。 equals/hashcode contractのこのリンクを参照してください。

+0

問題は、両方のarraylistsが異なるカウントを持つ可能性があるということです。その場合、上記を実行すると時間が大幅に増加する可能性があります。arraylistのサイズ(オブジェクトの数)は1000sに実行される可能性があります。それが理由です。このような比較を避けたいのです。それを行うための他の方法がありますか? – Raghu

+0

次に、私の更新された回答に従って、POJOでhashcode/equals overrideを追加する他のオプションを考えてみてください。 – kosa

+0

これはjava1.4で動作しますか? – Raghu

3

フィールドレベルの比較を行い、比較基準を満たしている場合はtrueを返すように、それぞれまたはcompareTo(CommonInterfaceOrSuperclass)メソッドを実装することができます。リストを繰り返し処理し、各要素をチェックする必要があります。

別の方法としては、適切にコード化されたとき、あなたのListが見つけ、首尾イコールネスのために比較することができるようになるequals()/hashcode()ペアを実装することです。あなたのテストがうまくいくはずです。

+0

私はJAVA 1.4を使用しています。それはこれでうまくいくのだろうか? – Raghu

4

デフォルトのObject.equalsの実装では、異なるクラスの2つのオブジェクトは決して同じではありません。

この動作が必要な場合は、クラスの.equalsをオーバーライドする必要があります(また、ハッシュコードもjavadocを参照してください)。

(または、コンパレータを作成してコレクションに渡します)。

+0

私はjava 1.4を使用しています...コンパレータは動作しますか? – Raghu

0

ここでは正しくないことをしようとしています。比較している2つのオブジェクトは、異なるオブジェクトであるだけでなく、リレーショナルをまったく持たない異なるタイプ(ClassAおよびClassB)でもあります。また

あなたのbListタイプClassBclsAのオブジェクトが含まれていますように、この

if(bList.contains(clsA)) 

のように比較しようとした場合、彼らはjava.lang.Objectクラスのequals()メソッドを使用して比較されますが、タイプClassAです。 したがってx.equals(y)は、xyが同じオブジェクト(x == yの値がtrueの場合)を参照する場合にのみ、trueを返します。

関連する問題