编辑:FML!我对哈希码的实现有一个小写的c.-.-
我一直在努力学习TDD并一直关注Kent Beck的"By Example"一书; 这很好!
但是,我似乎无法进步,因为当我访问哈希表时,值返回null.我已经运行了一个调试会话,并且具有该值的对象显然存在,但结果为null.
构建和访问的代码是:
public void addRate(String from, String to, int rate){
this.rates.put(new Pair(from, to), new Integer(rate));
}
Run Code Online (Sandbox Code Playgroud)
来自和来自"GBP"和"USD".也通过调试验证.
调用上面的测试用例:
@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);
}
Run Code Online (Sandbox Code Playgroud)
银行中的reduce方法调用方法速率:
public Money reduce(Bank bank, String to){
int rate = bank.rate(this.currency, to);
return new Money(this.amount / rate, to);
}
Run Code Online (Sandbox Code Playgroud)
问题出在哪里:
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();
}
Run Code Online (Sandbox Code Playgroud)
第一行应对美元 - >美元转换等.
Pair对象是2个用作密钥的字符串.
我没有使用过很多表但是我看不出问题是什么,我确定这些值在哈希表中但是'rate'总是返回一个空值.
我无法看到树木.:)有人能指出我正确的方向吗?
我认为问题在于Pair方法.当你这样做:
this.rates.get(new Pair(from, to));
您正在创建一个新实例Pair,该实例与您在addRate方法中放入地图的实例不同.
如果希望代码正常工作,则必须使用相同的Pair类实例或在类上正确实现equals和hashCode方法Pair.
以下是对HashMap内部工作的深入了解以及为使其工作所需做的工作:https://stackoverflow.com/a/6493946/2266098