Java 在编写hashcode和equals方法时需要帮助吗?

Java 在编写hashcode和equals方法时需要帮助吗?,java,equals,hashcode,Java,Equals,Hashcode,我有一个类,提供有关付款的详细信息 accountNo, transactionAmount, dateOfTransaction. 在这里,我想编写一个哈希函数,这样当我将这个类对象存储在一个哈希集中时,它将是有效的 主要的限制是付款细节应该是唯一的(假设一个特定的人不应该在一个月内支付两次费用) 有谁能帮我写下这个场景的hashCode和equals方法吗?你需要准确地确定你所说的相等是什么意思。特别是,你提到一个月内不支付两次——这是否意味着一笔交易在同一个月内应该与另一笔交易相

我有一个类,提供有关付款的详细信息

    accountNo, transactionAmount, dateOfTransaction.
在这里,我想编写一个哈希函数,这样当我将这个类对象存储在一个哈希集中时,它将是有效的

主要的限制是付款细节应该是唯一的(假设一个特定的人不应该在一个月内支付两次费用)

有谁能帮我写下这个场景的hashCode和equals方法吗?

你需要准确地确定你所说的相等是什么意思。特别是,你提到一个月内不支付两次——这是否意味着一笔交易在同一个月内应该与另一笔交易相等,即使是在不同的日子?这听起来像是一个相当奇怪的平等概念,而且非常特定于用法,而不是特定于类型。还要注意的是,交易只有一个账号——当然它应该有一个“from”和一个“to”账户,因为可能有多个人向同一个账户付款,也可能有一个账户在同一个月向多个账户付款

所以,就我个人而言,我不想以这种方式凌驾于平等之上,但如果你真的必须这样做,那也不难。。。一旦你决定了什么构成平等,我将实现
equals
——在这一点上
hashCode
通常是相当容易的

我强烈建议您阅读Josh Bloch在中关于平等的部分,以了解更多详细信息,但是
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
,而不仅仅是使用
=

提供的引用比较。我建议您使用apache commons包的hashcodebuilder:

还有一个EqualBuilder:


如果您同时实现了这两个功能,则不必担心将对象存储在哈希集中。

这个问题的最终答案是。

您可能会发现Apache Commons或Guava很有用:@satheesh您确定事务类不需要主键吗?还有,看完你之前的问题-这是什么?作业还是应用程序?你是否将数据保存在某个地方?@amal这是给me@satheesh您是否将数据持久化到某个位置?像db?正如在下面的评论中提到的,我认为您只需要在插入到集合/表之前验证数据。重写equals似乎不正确。至于标题栏中的问题,你需要知道hashcode是什么。一旦您知道了这一点,实现一个将是微不足道的。然而,我不确定你是否应该用这种方式来解决这个问题。@amal我明白你的意思……但我在这里写的只是一个java程序,没有任何数据库连接。。这里的学生需要每月存入一个帐户。如果他试图在同一个月再次存款,应该拒绝。这意味着他不应该支付两次为了一个特定的目的。@satheesh:但这听起来并不是真正的“平等”——老实说,我不认为我会为了这个目的重写equals和hashCode……这是我之前关于this@satheesh当前位置我的观点是,你以前收到的答案很可能因为额外的细节而无效。我只是不认为以一种能实际获得所需结果的方式覆盖
equals
是合适的。你可以做到这一点,它会工作-但你很快需要考虑交易平等的任何其他方式,你会陷入困境。这根本不是一种“自然”的平等形式。谢谢你,我在等别人这么说。@leigf,+1,我想这么说。@satheesh,谷歌是你的朋友。我提供的链接有一个example@Dabiel你能把书中与这个问题有关的部分寄给我吗1.因为我没有这本书