2017-06-20 25 views
-1

我有一堂課。但是,當我創建一組具有相同私人成員價值的學生時,這些學生被視爲不同的學生。我的設置應該過濾重複項,但不會。HashCodeBuilder和EqualsBuilder不起作用?

class Student { 
    private StudentType m_type; 
    private List<Attribute> m_attributes; 
    private DegreeType m_dType 

    @Override 
    public boolean equals(Object o) { 
     if (!(o instanceof Student)) { 
      return false; 
     } 

     Student st = (Student) o; 
     EqualsBuilder eb = new EqualsBuilder() 
      .append(m_type, st.m_type) 
      .append(m_attributes, st.m_attributes) 
      .append(m_dType, st.m_dType); 
     return eb.isEquals(); 
    } 

    @Override 
    public int hashCode() { 
     HashCodeBuilder hcb = new HashCodeBuilder() 
      .append(m_type) 
      .append(m_attributes) 
      .append(m_dType); 
     return hcb.toHashCode(); 
    } 
} 

注意:StudentType和DegreeType是枚舉。我使用Java 8

+2

這是我們要求[mcve]的地方。你提出的內容很短,但它不完整,因此也無法驗證。 –

+3

'StudentType','Attribute'和'DegreeType'也必須實現hashCode並且等於正確。我猜這是你的問題。 – marstran

+0

如果您使用的是Java 8,您可以使用Objects.hash(Object ...)和Object.equals(Object,Object)來代替 –

回答

0

沒有超載equals()的價值Attribute你很可能使用Java中的默認.equals()實現這是看兩個對象在內存中佔用相同的位置比較List<Attribute>

如果你實例化Student兩個不同的實例,則List<Attribute>內的兩個實例永遠不會相等,因爲他們將不同的名單 - 即使名單內,甚至包括以相同的順序完全相同的值。

EqualsBuilder並不完全是神奇的。只需在班級內的每個內部類型上調用.equals()即可。

總之:這是.equals()一路下降。確保爲每種必需的類型覆蓋它。

+0

'List'類型本身應該正確實現'equals'和'hashCode',以符合接口。 http://docs.oracle.com/javase/8/docs/api/java/util/List.html#equals-java.lang.Object- _et seq._所以你只需要處理'equals'和' hashCode'實現在你自己的類中。 –