【问题标题】:Java - Is it common practice to use a hashtable (eg HashMap) to map objects to themselves?Java - 使用哈希表(例如 HashMap)将对象映射到自身是常见的做法吗?
【发布时间】:2012-02-29 04:04:33
【问题描述】:

我正在制作一个 Java 应用程序,它将存储一堆随机单词(可以随时添加到应用程序中或从应用程序中删除)。我想要快速查找以查看给定单词是否在字典中。用于此的最佳 java 数据结构是什么?到目前为止,我正在考虑使用 hashMap,并使用同一个词作为值和该值的键。这是常见的做法吗?对(键,值)对中的键和值使用相同的字符串对我来说似乎很奇怪,所以我想确保没有更好的想法被我忽略了。

我也在考虑使用 treeMap 来保持单词排序,给我一个 O(lgn) 查找时间,但是据我了解 hashMap 应该给出一个预期的 O(1) 查找时间,所以我认为会更好。

所以基本上我只是想确保 hashMap 想法与字符串加倍作为每个 (key,value) 对中的键和值将是一个不错的决定。谢谢。

【问题讨论】:

  • 地图中的关键是什么?或者如果这个词是关键,那么价值是什么?
  • @Paul 这个词将兼作键和值。两者的词对象相同。这似乎是多余的,所以这就是我问这个问题的原因。

标签: java hashmap treemap


【解决方案1】:

我想要快速查找以查看给定单词是否在字典中。用于此的最佳 java 数据结构是什么?

这是Set 的教科书用例。您可以使用HashSetSet<T> 的幼稚实现使用对应的 Map<T, Object> 来简单地标记条目是否存在。

【讨论】:

  • 谢谢,看起来这样更有意义。根据 Java 的 API,看起来 HashSet 在内部使用了 HashMap。只是出于好奇,您是否认为 HashSet 基本上只是使用我在 add() 上给它的单个对象作为内部 HashMap 的键和值?
  • @Tim:IIRC,作为它使用一个常量对象的值,该对象只创建一次(单例)。但它使用什么实际上并不那么重要,因为无论哪种方式它都会占用引用空间。
  • @Tim:奇怪的问题。当我知道它是如何做到的时,我想知道的是第二个值的额外字节浪费的空间。第二个值有什么关系?
  • 我怀疑 hashSet 实现中的键和值可能是相同的引用(如 put(blammy, blammy)),但实际细节取决于实现。使用 javap(随 JRE 提供)反编译 JRE 的 hashSet 实现以找出答案。
【解决方案2】:

如果您将其存储为字典中的单词集合,我建议您查看Tries.,它们比Set 需要更少的内存,并且在最坏情况下O(string length) 具有快速查找时间。

【讨论】:

    【解决方案3】:

    Set 的任何类都应该有助于您的目的。但是,请注意Set 不允许重复。就此而言,即使Map 也不允许重复键。如果您需要添加重复条目并将它们分开处理,我建议您使用ArrayList(假设不需要同步)。

    【讨论】:

    • ArrayList 不会有 O(n) 的查找时间,因为它必须检查数组中的每个条目?
    • 虽然如此,但如果您有重复项并需要单独存储它们,则无法绕过它
    • @Mozen:根据您的数据类型的要求,有很多方法可以绕过它。一种是使用MultiMap,或Map<T, Integer>,或Bag
    • 是的......我的意思是他不能使用Set然后
    【解决方案4】:

    我唯一关心的是内存,如果你使用 HashSet 并且如果你有一个非常大的单词集合......那么你将不得不将整个集合加载到内存中......如果这不是问题...... ..(并且您的集合必须非常大才能成为问题)...然后 HashSet 应该没问题...如果您确实有非常大的单词集合,那么您可以尝试使用树,并且仅将您感兴趣的部分加载到内存中。

    还请记住,插入速度很快,但不如在树中快,请记住,要使其正常工作,Java 将插入已排序的每个元素。同样,没什么大不了的,但是如果一次添加很多单词,您可以考虑使用树...

    【讨论】:

    • 谢谢。我很困惑为什么在树中插入比在 hashSet 中更快?插入哈希表(假设它是一个好的哈希表)不是 O(1),而不是有序树中的 O(lgn) 插入时间?
    • @Tim 树在内存分配方面比基于哈希的数据结构更好,因为当哈希表变满时您必须重新索引它。
    • @Baumann:“当它满了”是什么意思?它不是在每个桶上使用可以增长到任意大小的链表吗?
    • 满的意思是桶的数量超过了HashSet的容量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2023-03-07
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多