检查Set <e>是否已包含某些值</e>

时间:2013-12-03 15:09:58

标签: java set contains

我有这个存储int对的类:

static class IntPair {
    int a;                  //JugsNode.a.content;
    int b;                  //JugsNode.b.content;

    public IntPair(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

和一个定义如下的集合:

static HashSet<IntPair> confs = new HashSet<IntPair>();

现在,它非常简单,我如何检查特定IntPair p对象是否已包含在此集合中,而没有引用它但仅包含其值?更清楚:

IntPair p = new Pair(0, 0);
confs.add(p);

IntPair p1 = new Pair(0, 0);
confs.contains(p1); 

显然,最后一次通话会返回false。那么,如何通过仅包含其值来检查该对是否被包含。

3 个答案:

答案 0 :(得分:6)

您需要覆盖equalshashCode

static class IntPair {
    int a;           
    int b; 

   @Override
   public boolean equals(Object other){
     if(other==null) return false;
     if(!(other instanceof IntPair)) return false;

     IntPair o=(IntPair) other;
     return this.a==o.a && this.b==o.b;
   }

   @Override
   public int hashCode(){
     return 31*a+b;
   }
}

答案 1 :(得分:1)

覆盖hashCode()个对象的equals()IntPair方法。

例如,您可以尝试如下

@Overrid
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof IntPair)) return false;

    IntPair intPair = (IntPair) o;

    if (a != intPair.a) return false;
    if (b != intPair.b) return false;

    return true;
  }

@Override
public int hashCode() {
    int result = a;
    result = 31 * result + b;
    return result;
}

答案 2 :(得分:1)

根据文档Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

您必须覆盖equalshashCode方法