2011-02-10 67 views
8
List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >(); 
    lp.add(new Pair("1", "2")); 

如何检查列表lp是否包含1和2,即Pair(“1”,“2”)。包含对列表

回答

7

您的Pair课程需要实施equals()hashCode()并且您全都设置完毕。根据该类型的equals()方法实施了List.contains()。请参阅API for List.contains()。 (编辑一下,以解决来自@maaartinus的评论,你应该阅读b/c的回答,观察结果是可靠的,我把它们放在这里有点荒谬,正如maaartinus指出的那样,这里最好的做法是避免容易出错的手动定义等号和散列码,而是建立在Guava的帮助函数nullable equalshashCode 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()?”

+0

很好的答案。我想我推动了你超过3000.酷。 – 2011-02-10 01:55:47

+1

和你的帽子尖端,气垫船... – andersoj 2011-02-10 01:59:55

1

由andersoj答案执行

return left != null && right != null && left.equals(p.left) && right.equals(p.right); 

是错误的:null测试清楚地表明null是一个合法的左右值。因此,至少有两个问题有:

  • new Pair(null, null).hashCode()抛出NPE
  • new 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); 
} 

当然,在构造函数中禁止空值是一个选项,太。