List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >();
lp.add(new Pair("1", "2"));
如何檢查列表lp是否包含1和2,即Pair(「1」,「2」)。包含對列表
List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >();
lp.add(new Pair("1", "2"));
如何檢查列表lp是否包含1和2,即Pair(「1」,「2」)。包含對列表
您的Pair
課程需要實施equals()
和hashCode()
並且您全都設置完畢。根據該類型的equals()
方法實施了List.contains()
。請參閱API for List.contains()
。 (編輯一下,以解決來自@maaartinus的評論,你應該閱讀b/c的回答,觀察結果是可靠的,我把它們放在這裏有點荒謬,正如maaartinus指出的那樣,這裏最好的做法是避免容易出錯的手動定義等號和散列碼,而是建立在Guava的幫助函數nullable equals和hashCode for n objects)。
final class Pair<T> {
final T left;
final T right;
public Pair(T left, T right)
{
if (left == null || right == null) {
throw new IllegalArgumentException("left and right must be non-null!");
}
this.left = left;
this.right = right;
}
public boolean equals(Object o)
{
// see @maaartinus answer
if (! (o instanceof Pair)) { return false; }
Pair p = (Pair)o;
return left.equals(p.left) && right.equals(p.right);
}
public int hashCode()
{
return 7 * left.hashCode() + 13 * right.hashCode();
}
}
用合適的equals()
,你現在可以做的:
lp.add(new Pair("1", "2"));
assert lp.contains(new Pair("1","2"));
應對下面的評論,也許這將是很好,包括一個很好的參考「爲什麼我需要實現hashCode()
?」
JavaPractices.com — Implementing equals()
— 「如果你重寫equals,就必須重寫了hashCode」
Object.equals()
contract as defined in the API documentation
由andersoj答案執行
return left != null && right != null && left.equals(p.left) && right.equals(p.right);
是錯誤的:null測試清楚地表明null是一個合法的左右值。因此,至少有兩個問題有:
new Pair(null, null).hashCode()
拋出NPEnew Pair(null, null)
不等於自己!看看Guava class正確實現的對象。使用它或寫一個靜態幫手方法,如
public static boolean equal(Object a, Object b) {
return a==b || a!=null && a.equals(b);
}
public static int hashCode(Object a) {
return a==null ? 0 : a.hashCode();
}
並始終使用它們。
千萬不要寫包含空測試的equals
。
這很容易吹,它沒有人注意到它。使用助手,是微不足道的得到它的權利:
public boolean equals(Object o) {
if (!(o instanceof Pair)) return false;
Pair p = (Pair) o;
return Helper.equals(left, p.left) && Helper.equals(right, p.right);
}
public int hashCode() {
return 7 * Helper.hashCode(left) + 13 * Helper.hashCode(right);
}
當然,在構造函數中禁止空值是一個選項,太。
很好的答案。我想我推動了你超過3000.酷。 – 2011-02-10 01:55:47
和你的帽子尖端,氣墊船... – andersoj 2011-02-10 01:59:55