我有一个课程,提供有关付款的详细信息。属性
accountNo, transactionAmount, dateOfTransaction.
这里我想编写哈希函数,以便在将这个类对象存储在hashSet中时效率很高。
主要限制因素是付款细节应该是唯一的(假设某个人不应该在一个月内支付两次费用。)
任何人都可以帮助我为hashCode编写这个场景并且也等于方法吗?
答案 0 :(得分:3)
您需要确定完全您的平等意味着什么。特别是,你谈到不在月支付两次 - 这是否意味着一个交易应该等于另一个交易,如果它在同一个月,即使它是在另一天?这听起来有点奇怪 - 而且非常特定于用途而不是特定类型 - 平等的概念。另请注意,该交易只有一个帐号 - 当然它应该同时包含“来自”和“到”帐户,因为可能会有从多个人付款到同一帐户,并且可能在同一个月内从一个帐户付款到多个帐户。
所以,我个人不想以这种方式覆盖平等,但如果你真的必须这样做,那就不难了......一旦你决定了什么构成平等,我就会实现{{1} } - 此时equals
通常相当容易。
我强烈建议您阅读Josh Bloch关于Effective Java (second edition)中的平等的部分以获取更多详细信息,但hashCode
通常看起来像这样:
equals
请注意,对于任何引用类型的字段,您需要确定要在其中应用的相同类型 - 通常您需要调用@Override public boolean equals(Object other)
{
if (other == null || other.getClass() != this.getClass())
{
return false;
}
BankTransaction otherTransaction = (BankTransaction) other;
return accountNo == otherTransaction.accountNo
&& transactionAmount == otherTransaction.transactionAmount
&& // etc;
}
而不是仅仅使用equals
提供的参考比较。
答案 1 :(得分:3)
我建议你使用apache commons包的hashcodebuilder:
http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/HashCodeBuilder
还有一个EqualsBuilder:
http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/EqualsBuilder
如果您同时实施,则不必担心将对象存储在哈希集中
答案 2 :(得分:2)
这个问题的最终答案在Effective Java (second edition)。