編輯: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'總是返回一個空值。
我看不到樹木。 :)請問有人能指出我正確的方向嗎?
他還需要使'Pair'不可變。 –
謝謝,我的等號方法是:public boolean equals(Object object){pair} =(Pair)object; 返回this.from.equals(pair.from)&& this.to.equals(pair。至); } 但是,我現在看看我是如何創建和傳遞密鑰的,我有一個方向,所以非常感謝! :D – null
用你的equals方法應該可以工作,但是你還需要提供'hashCode'方法,它將爲相同的值返回相同的結果。爲了確認它正在工作,可以使hashCode()方法始終返回0。在性能方面,這會將HashMap減少爲LinkedList,但是您將滿足合同,這隻表示兩個對象必須具有相同的hashCode(如果它們是equals)。 – NeplatnyUdaj