2013-05-20 116 views
-3

如果我想检查某个类MyClass的某个对象是否包含在一个ArrayList或类似对象中,我可以重写equals。检查HashSet/HashMap是否包含对象

public boolean equals(Object o) { 
    ..... 
} 

但如果我想检查MyClass的对象是否包含在HashMap或HashSet中,我该怎么办? 我猜hashCode必须被覆盖?这是正确的吗?我该怎么做? Thx! 编辑:我完全知道包含/ containsKey或类似。但是,为什么足以覆盖列表的等于而不是集合。如果我只是测试一个数组列表是否包含一个对象,覆盖的方法就可以正常工作。对于设置它是不够的。我的问题是我还需要额外改写i.o.去实现。我不想要一个额外的方法,关键在于我猜的hashCode。

+0

http://docs.oracle。com/javase/7/docs/api/java/util/Set.html#contains(java.lang.Object)&http://docs.oracle.com/javase/7/docs/api/java/util/Map .html#values%28%29&http://stackoverflow.com/q/27581/139010 –

+0

你想要找出一个键或值吗? –

回答

2

您可以使用contains()方法检查HashSet是否包含对象。

您可以使用containsKey()方法检查HashMap是否包含对象作为关键字。

对于任一种,您可以覆盖Object.equals()Object.hashCode()。通常如果你重写一个,你也必须重写另一个,以满足他们的contracts

2

完全一样。事实上,有两个部分

  • 在你的类中重写equals它是有意义的

  • 使用在检索对象的容器的制造方法。当然,该方法将使用该对象的equals方法。

HashSet的具有方法和HashMap一个containsKey/containsValue

2

是的,你将不得不重写你的equals()方法中MyClass类方法。

下面是一个例子:

public class MyClass { 
    private String name; 
    private String gender; 

    public MyClass(String name, String gender) { 
     this.name = name; 
     this.gender = gender; 
    } 

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

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((gender == null) ? 0 : gender.hashCode()); 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

注意这是一个良好的编程习惯来覆盖哈希码()当您覆盖等于()方法,特别是在哈希概念进入画面场景例如HashMap

然后,您可以比较如下:

public class Test { 
    public static void main(String args[]) throws Exception { 
     MyClass myFirstClass = new MyClass("John", "Male"); 
     MyClass mySecondClass = new MyClass("Jessica", "Female"); 
     Set<MyClass> mySet = new HashSet<MyClass>(); 

     mySet.add(myFirstClass); 
     mySet.add(mySecondClass); 

     MyClass myDupeClass = new MyClass("Jessica", "Female"); 

     for (MyClass someClass: mySet) { 
      if (someClass.equals(myDupeClass)) { 
       System.out.println("Match found for: " + someClass.getName()); 
      } 
     } 
    } 
} 

输出为预期

Match found for: Jessica 
+0

尝试:mySet.contains(myDupeClass),它返回空.... –

+0

不,它不会给出适当的匹配。 –

+0

如果(mySet.contains(myDupeClass)) \t \t { \t \t \t的System.out.println( “是”); \t \t}输出结果为是 –

相关问题