2015-03-02 73 views
1

在我的代碼我有一組PlacesInfo對象即,如何重寫hashcode和equals方法以避免在java中的HashSet中添加重複的字符串?

Set<PlacesInfo> placeId;  

在這集我加入placeId(字符串)。我需要避免將重複項添加到我的HashSet。下面是我的覆蓋方法。但是,它仍然是添加重複元素到我的設置。那麼,如何避免這一點?

@Override 
public int hashCode() { 
    int hash = 5; 
    hash = 97 * hash + Objects.hashCode(this.placeId); 
    return hash; 
} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return true; 
    } 
    if (this.getClass() != obj.getClass()) { 
     return false; 
    } 
    final PlacesInfo other = (PlacesInfo) obj; 
    if (!Objects.equals(this.placeId, other.placeId)) { 
     return false; 
    } 
    return true; 
} 
+2

我假設給定的'hashCode'和'equals'方法是'PlacesInfo'類的一部分。我無法用你的方法使用'HashSet'重現這一點。一些更多的代碼可能有助於追蹤錯誤。 [來源](http://ideone.com/HURDbi) – Obicere 2015-03-02 04:57:18

+4

對於初學者來說,你的'equals'方法說你的所有對象都等於null。 – chrylis 2015-03-02 06:04:58

+0

'placeId'是什麼類型? – Mureinik 2015-03-02 07:59:23

回答

1

試試這個

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

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    PlacesInfo other = (PlacesInfo) obj; 
    if (placeId == null) { 
     if (other.placeId != null) 
      return false; 
    } else if (!placeId.equals(other.placeId)) 
     return false; 
    return true; 
} 
+0

感謝您的回覆 – 2015-03-02 14:48:00

0
Below code working fine.If you remove equals and hashcode then it will add two elements. 

import java.util.HashSet; 
import java.util.Objects; 
import java.util.Set; 

class PlacesInfo { 

     int placeId; 

     public int getId() { 
      return placeId; 
     } 

     PlacesInfo(int placeId) { 
      this.placeId = placeId; 
     } 

     public void setId(int placeId) { 
      this.placeId = placeId; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj == null) 
       return true; 
      if (this.getClass() != obj.getClass()) 
       return false; 
      final PlacesInfo other = (PlacesInfo) obj; 
      if (!Objects.equals(this.placeId, other.placeId)) 
       return false; 
      return true; 
     } 

     @Override 
     public int hashCode() { 
      int hash = 5; 
      hash = 97 * hash + Objects.hashCode(this.placeId); 
      return hash; 
     } 
    } 

public class Test { 

     public static void main(String[] args) { 
      PlacesInfo t1 = new PlacesInfo(1); 
      PlacesInfo t2 = new PlacesInfo(1); 
      System.out.println(t1.equals(t2)); 
      Set<PlacesInfo> tempList = new HashSet<PlacesInfo>(2); 
      tempList.add(t1); 
      tempList.add(t2); 
      System.out.println(tempList); 
     } 
} 
+0

感謝您的回覆 – 2015-03-02 14:48:21

1

嘗試Lombok。我已經將GAgarwal解決方案簡化爲一個小課堂。

import lombok.EqualsAndHashCode; 
import lombok.Getter; 
import lombok.Setter; 

@EqualsAndHashCode(of={"placeId"}) 
public class PlacesInfo{ 

     @Getter; @Setter; 
     int placeId; 

     PlacesInfo(int placeId) { 
      this.placeId = placeId; 
     } 
} 

龍目島是由Maven avalaible。你不需要將它包含在最終的jar中。僅用於編譯。

<dependency> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok</artifactId> 
    <version>1.14.8</version> 
    <scope>provided</scope> 
</dependency> 
+0

愛這個依賴!與Set 一起使用。一切都很好 – 2016-06-27 06:11:58

相關問題