【问题标题】:Hash table manual collision handling in JavaJava中的哈希表手动冲突处理
【发布时间】:2012-04-29 10:02:49
【问题描述】:

我的任务是做一个银行管理系统。客户账户使用哈希表保存在银行内部,因此对于每个客户,由个人识别号表示,将有一个账户数组列表(客户最多可以有 2 个账户 - 一个储蓄账户和一个消费账户)。

我要做的是手动处理可能发生的冲突。我怎样才能做到这一点?我必须重写什么方法?我不得不提一下,HashTables 不是我的菜,因为我在 C 语言中使用它们时遇到了困难。

附: - 我打算使用 HashMap,因为我理解它更容易使用。

编辑 - 手动碰撞处理是必需的。

EDIT 2 - 这是一个要求,因为实验室助理希望我们了解哈希表的工作原理。经过更多的挖掘,我想我需要重写 Hashtable 中的“equals”方法,所以没有 HashMap。这是一个正确的方法吗? (不需要新的 ADT)

【问题讨论】:

  • 请解释如何/为什么这是一项要求。您是否需要在 Java 中实现自己的哈希表?
  • 如果要处理冲突,那么你需要构建自己的数据结构(你不能使用HashMap,因为它只是工作)。

标签: java hashtable collision


【解决方案1】:

标准哈希表实现会自动进行冲突处理,而您无法控制它。但是,您必须做的是为用作键的对象实现hashCode()equals() - 但在String / Number 的情况下,标准库也已经完成了。 因此,如果任务真的是让您处理冲突 - 那么您必须构建自己的 Map 实现。

【讨论】:

    【解决方案2】:

    我要做的是手动处理可能发生的冲突。我该怎么做?

    如果您自己进行冲突处理是一项硬性要求,您将需要从头开始实现哈希表。您不能使用 HashMapHashTable 或我知道的任何其他现有类...因为它们都为您处理碰撞等。

    我不得不提一下,HashTables 不是我的最爱,因为我在 C 中使用它们时遇到了困难。

    多么不幸。您将必须了解它们才能完成此练习。 (再想一想,也许这个要求是一件好事......如果它迫使你正确理解哈希表的工作原理。)

    作为记录,有很多关于数据结构的好文章解释了哈希表的工作原理。如果您没有教科书,the Wikipedia page 非常全面。教科书和维基百科都会描述处理碰撞的各种技术。


    经过更多的挖掘,我想我需要重写 Hashtable 中的“equals”方法,所以没有 HashMap。这是一个正确的方法吗? (不需要新的 ADT)

    我不这么认为。

    • Hashtable/HashMapequals方法与哈希表条目的冲突处理无关。

    • Hashtable / HashMap 中的碰撞检测逻辑位于私有方法中,因此您无法直接覆盖它。

    我认为实验室助理希望/期望您实现哈希表 ADT,但我不知道您如何避免这样做。但是,嘿,你总是可以询问实验室助理他或她希望你做什么。


    额外建议:地图的目标类型应该是一个自定义类,其中包含对两个帐户的引用,以及用户的个人详细信息。它不应该是ArrayList

    【讨论】:

    • 手动碰撞处理是一项要求。如何使用 HashMap 做到这一点?
    • @MihaiAndreiRustiuc HashMap 的碰撞处理是自动的,它不暴露手动碰撞处理的方法。
    • 助教把它作为需求贴出来,以便我们更好地理解HashTables和碰撞。
    • @josefx 好的,那么我应该使用什么来手动处理冲突?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2015-04-07
    • 2013-06-16
    • 2017-06-25
    • 2021-12-18
    • 2015-10-03
    • 2011-02-17
    相关资源
    最近更新 更多