2013-05-30 29 views
1

我有一些代碼,例如:怎樣的Java中實現Objects.hashcode 1.6

@Override 
public int hashCode() { 
    int hash = 5; 
    hash = 47 * hash + Objects.hashCode(this.bendWidth); 
    hash = 47 * hash + Objects.hashCode(this.bendSideLength); 
    hash = 47 * hash + Objects.hashCode(this.thickness); 
    hash = 47 * hash + Objects.hashCode(this.innerRadius); 
    hash = 47 * hash + Objects.hashCode(this.bendAngle); 
    hash = 47 * hash + Objects.hashCode(this.kfactor); 
    hash = 47 * hash + Objects.hashCode(this.bendShortening); 
    return hash; 
} 

,我期待,使這個源碼工作1.6

到目前爲止,我已經試過番石榴:

@Override 
public int hashCode() { 
    int hash = 5; 


    Object[] objs = new Object[]{ 
     this.getPointND().getPoint()[0], 
     this.getPointND().getPoint()[1], 
     this.getPointND().getPoint()[2], 
     this.getPointND().getPoint()[3], 
     this.getPointND().getPoint()[4], 
     this.kfactor, 
     this.bendShortening 
    }; 

    hash = 47 * hash + Objects.hashCode(objs); 

    hash = 47 * hash + Objects.hashCode(this.bendWidth); 
    hash = 47 * hash + Objects.hashCode(this.bendSideLength); 
    hash = 47 * hash + Objects.hashCode(this.thickness); 
    hash = 47 * hash + Objects.hashCode(this.innerRadius); 
    hash = 47 * hash + Objects.hashCode(this.bendAngle); 
    hash = 47 * hash + Objects.hashCode(this.kfactor); 
    hash = 47 * hash + Objects.hashCode(this.bendShortening); 
    return hash; 
} 

而且我已經嘗試瞭解決方案,所以:

@Override 
    public int hashCode() { 
     int hash = 5; 


     Object[] objs = new Object[]{ 
      this.getPointND().getPoint()[0], 
      this.getPointND().getPoint()[1], 
      this.getPointND().getPoint()[2], 
      this.getPointND().getPoint()[3], 
      this.getPointND().getPoint()[4], 
      this.kfactor, 
      this.bendShortening 
     }; 

     hash = 47 * hash + Objects.hashCode(objs); 

     hash = 47 * hash + Objects.hashCode(this.bendWidth); 
     hash = 47 * hash + Objects.hashCode(this.bendSideLength); 
     hash = 47 * hash + Objects.hashCode(this.thickness); 
     hash = 47 * hash + Objects.hashCode(this.innerRadius); 
     hash = 47 * hash + Objects.hashCode(this.bendAngle); 
     hash = 47 * hash + Objects.hashCode(this.kfactor); 
     hash = 47 * hash + Objects.hashCode(this.bendShortening); 
     return hash; 
    } 

但還是這個測試返回失敗:

@Test 
public void testHashCodeIsDifferentHashCode() { 
    try { 
     DataPoint pointOne = new DataPoint(); 
     pointOne.setBendAngle(new Double(1)); 
     pointOne.setBendShortening(new Double(1)); 
     pointOne.setBendSideLength(1); 
     pointOne.setBendWidth(1); 
     pointOne.setInnerRadius(1); 
     pointOne.setKfactor(new Double(1)); 
     pointOne.setThickness(1); 

     DataPoint pointTwo = new DataPoint(); 
     pointTwo.setBendAngle(0); 
     pointTwo.setBendShortening(new Double(0)); 
     pointTwo.setBendSideLength(0); 
     pointTwo.setBendWidth(0); 
     pointTwo.setInnerRadius(0); 
     pointTwo.setKfactor(new Double(0)); 
     pointTwo.setThickness(0); 

     DataPoint pointThree = new DataPoint(); 
     pointThree.setBendAngle(Double.NaN); 
     pointThree.setBendShortening(Double.NaN); 
     pointThree.setBendSideLength(Double.NaN); 
     pointThree.setBendWidth(Double.NaN); 
     pointThree.setInnerRadius(Double.NaN); 
     pointThree.setKfactor(Double.NaN); 
     pointThree.setThickness(Double.NaN); 

     Set<DataPoint> map = new HashSet<DataPoint>(); 
     map.add(pointOne); 
     map.add(pointTwo); 
     assert (map.size() == 2); 
    } catch (NullPointerException ex) { 
     assert false : "failed due to null"; 
    } catch (Exception ex) { 
     assert false : "failed, unknown error."; 
    } 
} 

試過這樣:

@Override 
public int hashCode() { 
    int hash = 5; 
    hash = 47 * hash + Objects.hashCode(this.bendWidth); 
    hash = 47 * hash + Objects.hashCode(this.bendSideLength); 
    hash = 47 * hash + Objects.hashCode(this.thickness); 
    hash = 47 * hash + Objects.hashCode(this.innerRadius); 
    hash = 47 * hash + Objects.hashCode(this.bendAngle); 
    hash = 47 * hash + Objects.hashCode(this.kfactor); 
    hash = 47 * hash + Objects.hashCode(this.bendShortening); 
    return hash; 
} 
public class Objects { 

    public static int hashCode(Object object) { 
     return object == null ? 0 : object.hashCode(); 
    } 
} 

我等於解決方案是這樣:

@Override 
public boolean equals(Object obj) { 
    if (obj instanceof DataPoint) { 
     DataPoint od = (DataPoint) obj; 
     return (this.bendAngle == od.bendAngle) 
       && (this.bendShortening == od.bendShortening) 
       && (this.bendSideLength == od.bendSideLength) 
       && (this.bendWidth == od.bendWidth) 
       && (this.innerRadius == od.innerRadius) 
       && (this.kfactor == od.kfactor) 
       && (this.thickness == od.thickness); 
    } 
    return false; 
} 
+1

不,這是在jdk 1.7中添加的。你將不得不推出你自己的解決方案。 –

+0

不,沒有。 –

+0

在任何情況下,您選擇的IDE都應該具有一些智能的「生成equals()和hashcode()」函數。 – vikingsteve

回答

0

等於方法是個問題。新的Double(0.0)==新的Double(0.0)評估爲false。

+1

自動拆箱浪費我們時間的另一個「勝利」。 – user949300

2

這是一個選項:

@Override 
public int hashCode() { 
    return Arrays.asList(this.bendWidth, this.x, this.y).hashCode(); 
} 

是安全的,並生成一個很好的哈希碼。也有在quava一個對象類:

com.google.common.base.Objects 
4

沒有什麼在JDK 1.6,但它是完全微不足道的自己編寫:

public static int hashCode(Object object) { 
    return object == null ? 0 : object.hashCode(); 
} 

或者 - preferrably,IMO - 開始使用Guava具有熟悉的類Objects類。 (這不完全相同,因爲它只有通過可變參數傳遞數組的版本,但這意味着您可以在一次調用中編寫您的方法。)

我懷疑你會發現如果仔細觀察在Guava,有一些有用的東西,你會開始使用 - 我知道我現在不想在沒有Guava或類似的東西的情況下編寫任何有意義的Java代碼。

如果這是一個依賴只是Objects.hashCode我只是實現這種方法我自己,但我敢肯定還有其他的事情,你會發現有用的。

+2

@dah:那麼你需要重寫'equals' - 你有沒有做過?哈希映射只會防止重複鍵* - 不清楚您是使用這個鍵還是值。 –

+0

對不起。我的意思是散列集。我已經添加了我嘗試過的解決方案,以及我對問題的等式例程。 – davidahines

相關問題