2012-03-23 4 views
1

私の試みを働いていないのArrayListの含まれているが、私は の実装(ArrayList.containsのために等しい&ハッシュコード)メソッドをカスタマイズする

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result; 

    if (keyValue == null) { 
     result += 0; 
    } else { 
     result += keyValue.hashCode(); 
    } 

    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 

    TaskOverrideItemDo other = (TaskOverrideItemDo) obj; 

    if (keyValue == null) { 
     if (other.keyValue != null) { 
      return false; 
     } 
    } else if (!keyValue.equals(other.keyValue)) { 
     return false; 
    } 
    return true; 
} 

TaskCandidateListItemDo

クラス内でこれらのメソッドを生成するためにEclipseを使用し、ここだ、私はそれを使用する方法です

taskCandidateList = (List<TaskCandidateListItemDo>) namedQuery.list(); 

for (TaskOverrideItemDo taskOverrideItemDo : validateOverrideListSearchCriteriaDo 
     .getTaskOverrideItemDoList()) { 

    if (taskCandidateList.contains(taskOverrideItemDo.getKeyValue())) { 
     // do some code 
    } 
} 

マイリスト

private List<TaskCandidateListItemDo> taskCandidateList; 

//は、いくつかのコードを実行する以下のように宣言しましたkeyValueが存在していても、if文の内部は実行されません。また、ブレークポイントは、私はこれが問題である疑いがある.. equalsメソッドで

答えて

1

をブレークポイント(またはログ)を置きます別の方法として、あなたはequalsメソッド内keyValueのタイプとの比較をサポートすること

if (getClass() != obj.getClass()) { 
    return false; 
} 

TaskCandidateListItemDoのため。

+0

ありがとうAndriano、これを試してみる – sonx

2

を停止wouldntは:

if (getClass() != obj.getClass()) { 
    return false; 
} 

これは休止状態からであると仮定すると、あなたが戻って取得実際オブジェクトはよくいくつかのものであってもよいですバイトコード操作されたサブクラスTaskCandidateListItemDo

もちろん、デバッガを使ってそのことを知ることができます。

if (taskCandidateList.contains(taskOverrideItemDo)) { 

getKeyValue()がなければ、私はそれがフィールドkeyValueの値を返します(そして、あなたのequals方法だけを比較するとします。ちょうどで試してみてください...そのreturn false

+0

(ハッシュ)セットも使用してください。 –

+0

@JoopEggen:または、おそらく 'LinkedHashSet'、順序が重要かどうかによって決まります。しかし、最初に平等の部分を取り上げましょう:)少数の結果があれば、それは問題にならないでしょう。 –

+0

は、ArrayListがTaskCandidateListItemDoである間に、TaskOverrideItemDoを渡すことの影響は何ですか?私はこれをTaskCandidateListItemDoをこの配列リストに渡すように変更しましたが、同じ結果を返します。 – sonx

関連する問題