Java - 通常的做法是使用哈希表(例如HashMap)将对象映射到自己?

时间:2012-02-07 17:47:14

标签: java hashmap treemap

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

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

所以基本上我只是想确保hashMap想法与字符串加倍,因为每个(键,值)对中的键和值都是一个很好的决定。感谢。

4 个答案:

答案 0 :(得分:8)

  

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

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

答案 1 :(得分:1)

如果你将它存储为字典中的单词集合,我建议你看看Tries.它们需要的内存少于Set,并且可以快速查找最坏情况O(string length)

答案 2 :(得分:0)

任何Set的课程都应该有助于您的目的。但是,请注意Set不允许重复。就此而言,即使Map也不允许重复密钥。如果你需要添加重复的条目并将它们视为单独的,我建议你使用一个ArrayList(假设不需要同步)。

答案 3 :(得分:0)

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

另外请记住,插入速度很快,但没有树中那么快,请记住,为了实现这一点,Java将插入每个排序的元素。同样,没什么大不了的,但是如果你一次添加很多单词,你可以考虑使用树......