2015-04-28 48 views
0

編輯:FML!我的hashcode實現有一個小寫的c。 -.-散列表返回空但對象鍵存在

我一直在嘗試學習TDD,並一直關注Kent Beck的「By Example」一書;這很好!

但是,我似乎無法取得進展,因爲當我訪問哈希表時值返回null。我運行了一個調試會話,並且具有該值的對象顯然存在,但結果爲空。

的代碼來構建和訪問是:

public void addRate(String from, String to, int rate){ 
    this.rates.put(new Pair(from, to), new Integer(rate)); 
} 

從和是「英鎊」和「美元」。也通過調試進行驗證。

測試用例調用上面:

@Test 
public void testreduceMoneyDifferentCurrency(){ 
    Bank bank = new Bank(); 
    bank.addRate("GBP", "USD", 2); 
    Money result = bank.reduce(Money.gbpound(2), "USD"); 
    assertEquals(Money.dollar(1), result); 
} 

銀行的降低方法調用方法率:

public Money reduce(Bank bank, String to){ 
    int rate = bank.rate(this.currency, to); 
    return new Money(this.amount/rate, to); 
} 

這哪裏是問題是:

public int rate(String from, String to){ 
    if (from.equals(to)) return 1; 
    Integer rate = (Integer) this.rates.get(new Pair(from, to)); 
    return rate.intValue(); 
} 

第一對付USD - > USD轉換等。

Pair對象是構建用作鍵的2個字符串。

我還沒有使用過很多表,但是我看不到問題是什麼,我確定這些值是在散列表中,但'rate'總是返回一個空值。

我看不到樹木。 :)請問有人能指出我正確的方向嗎?

回答

8

我認爲問題出在Pair方法中。 當你這樣做:

this.rates.get(new Pair(from, to));

要創建的Pair一個新的實例,這是不一樣的,你已經把到地圖中addRate方法之一。

如果你想要的代碼才能正常工作,您可能已使用Pair類的同一個實例或正確地貫徹執行equalsPairhashCode方法。

這裏有點更深入的瞭解上HashMap的內部工作,你需要做的,使其工作是什麼:https://stackoverflow.com/a/6493946/2266098

+0

他還需要使'Pair'不可變。 –

+0

謝謝,我的等號方法是:public boolean equals(Object object){pair} =(Pair)object; 返回this.from.equals(pair.from)&& this.to.equals(pair。至); } 但是,我現在看看我是如何創建和傳遞密鑰的,我有一個方向,所以非常感謝! :D – null

+0

用你的equals方法應該可以工作,但是你還需要提供'hashCode'方法,它將爲相同的值返回相同的結果。爲了確認它正在工作,可以使hashCode()方法始終返回0。在性能方面,這會將HashMap減少爲LinkedList,但是您將滿足合同,這隻表示兩個對象必須具有相同的hashCode(如果它們是equals)。 – NeplatnyUdaj

0

的Java對象保持的參考。所以,當你試圖做到這一點 this.rates.get(new Pair(from, to)); 你基本上是創建一個Pair的新實例,它不存在作爲您的HashMap中的一個關鍵。

+0

爲什麼添加重複的答案? –

+0

當我寫作時,答案不存在。 – articuno