哈希表返回 null 但存在对象键
Hashtable returning null but object key is present
编辑:卧槽!我的哈希码实现有一个小写的 c。 -.-
我一直在尝试学习 TDD,并且一直在关注 'By Example' Kent Beck 的书;非常好!
但是,我似乎无法取得进展,因为当我访问哈希表时某个值返回 null。我有一个调试会话 运行,具有该值的对象显然存在,但结果为空。
构建和访问的代码是:
public void addRate(String from, String to, int rate){
this.rates.put(new Pair(from, to), new Integer(rate));
}
从和到是 "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);
}
bank中的reduce方法调用方法rate:
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 个字符串,用作键。
我没有大量使用 has 表,但我看不出问题出在哪里,我确定这些值在哈希表中,但 'rate' 总是返回空值。
只见树木不见森林。 :) 有人能给我指出正确的方向吗?
我认为问题出在 Pair
方法中。
当你这样做时:
this.rates.get(new Pair(from, to));
您正在创建 Pair
的新实例,它与您在 addRate
方法中放入地图的实例不同。
如果您希望代码正常工作,您要么必须使用相同的 Pair
class 实例,要么在 equals
和 hashCode
上正确实现方法=10=] class.
下面是对 HashMap 内部工作的更深入的了解,以及你必须做些什么才能让它工作:
Java 保留对象的引用。所以当你试图这样做时
this.rates.get(new Pair(from, to));
您基本上是在创建 Pair
的新实例,它在您的 HashMap
.
中不作为键存在
编辑:卧槽!我的哈希码实现有一个小写的 c。 -.-
我一直在尝试学习 TDD,并且一直在关注 'By Example' Kent Beck 的书;非常好!
但是,我似乎无法取得进展,因为当我访问哈希表时某个值返回 null。我有一个调试会话 运行,具有该值的对象显然存在,但结果为空。
构建和访问的代码是:
public void addRate(String from, String to, int rate){
this.rates.put(new Pair(from, to), new Integer(rate));
}
从和到是 "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);
}
bank中的reduce方法调用方法rate:
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 个字符串,用作键。
我没有大量使用 has 表,但我看不出问题出在哪里,我确定这些值在哈希表中,但 'rate' 总是返回空值。
只见树木不见森林。 :) 有人能给我指出正确的方向吗?
我认为问题出在 Pair
方法中。
当你这样做时:
this.rates.get(new Pair(from, to));
您正在创建 Pair
的新实例,它与您在 addRate
方法中放入地图的实例不同。
如果您希望代码正常工作,您要么必须使用相同的 Pair
class 实例,要么在 equals
和 hashCode
上正确实现方法=10=] class.
下面是对 HashMap 内部工作的更深入的了解,以及你必须做些什么才能让它工作:
Java 保留对象的引用。所以当你试图这样做时
this.rates.get(new Pair(from, to));
您基本上是在创建 Pair
的新实例,它在您的 HashMap
.