2013-05-20 118 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}輸出結果爲是 –

相關問題