2014-11-15 96 views
1

我知道這是問了很多,我不知道如果我很理解哈希碼,但它應該是地址,讓我怎麼解決我的具體的例子?如果我的理解是正確的,我有雙打在我的課,但我不能將它們添加到散列碼,因爲重載hashCode()方法在Java中使用雙重價值

possible loss of precision 
found : double 
required: int 
    return this.area(); 

這裏是我Shape類:

abstract class Shape implements Comparable<Shape> 
{ 
    abstract double area(); 


    public int compareTo(Shape sh){ 
     return Double.compare(this.area(),sh.area()); 
    } 

    public int hashCode() { 
     return this.area();  
    } 

    public boolean equals(Shape sh) { 
     if (sh instanceof Shape && this.area()==sh.area()) { 
      return true;   
     } else { 
      return false ; 
     } 
    } 
} 

area()的唯一的價值,我需要擔心hashCode()?

+0

hashCode的行爲應該與equals的行爲相匹配,如果兩個對象被認爲相等,使用equals,那麼兩個對象的hashCode應該是相同的。如果您只使用形狀的區域來確定它是否相等,那麼您可以返回hashCode的區域。 – DanielGibbs

+3

'Shape'是一個抽象類。你是否希望同一區域的兩個形狀相同,即使它們是不同的形狀? – khelwood

回答

3

您可以使用Double類的hashCode的例子:

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

這樣可避免損失由簡單的將double轉換爲int引起的精度。

如果該區域是確定hashCode的唯一屬性,則可以使用完全相同的代碼,用area代替value

但是,我不知道area是計算的hashCode一個很好的候選人,因爲它本身就是從形狀的子類的屬性來計算。您應該根據該子類的特定屬性在Shape的每個子類中實現hashCode。

+0

@ user4254704我假設該區域是使用Shape的子類的屬性進行計算的。看我的編輯。 – Eran

+0

@ user4254704這是Double類的靜態方法。試試Double。doubletolongbits – Eran

+0

如果我有多個值,該怎麼辦 –

1

不要只加數字加在一起,產生的哈希碼;這很可能會爲不相等的對象靠近在一起得到重複的散列碼。相反,我建議使用標準Java API中的Objects.hash方法或Apache Commons-Lang中更具表現力和效率更高的HashCodeBuilder。您應該在hashCode計算中包含與您用於確定equals的字段完全相同的字段。

當然,作爲@khelwood指出的那樣,你很可能想要實現equalshashCode這個抽象的對象,因爲1×4矩形和一個2x2的矩形可能是不相等的。相反,你可以在Shape重新申報這些方法作爲abstract迫使子類實現他們:

public abstract class Shape { 
    @Override 
    public abstract int hashCode(); 
} 
+0

是的,我知道你在說什麼,我只是不知道如何識別兩個不同的形狀是相等的 –

+0

@ user4254704你必須弄清楚什麼是規則。大多數對象僅與完全相同類別的其他對象相同。 – chrylis

0

你可以這樣做:

public int hashCode() { 
    return Double.valueOf(this.area()).hashCode(); 
} 

- 版:修正的valueOf方法名。謝謝@ user4254704。

+1

這給出了一個錯誤 –