从列表中查找重复的字符串(包含500万个字符串),没有“内存不足”错误

时间:2017-10-30 05:10:15

标签: java string duplicates

我必须检查是否已从数据源中拾取字符串。我可以使用HashMap,但由于密钥的数量很大,因此可能会导致内存不足错误。 那么从500万字符串中找到重复的最佳方法是什么? 提前致谢。

1 个答案:

答案 0 :(得分:2)

没有给你代码,这是一个粗略的算法。

对输入文件进行一次传递,计算每个String的哈希码。将这些哈希码存储在HashMap中,其中键是每个String的哈希码,值是找到哈希码的次数。此时,您不是自己存储字符串 - 只存储哈希码。

现在遍历HashMap,删除其中值(即与哈希码关联的计数)为1的所有条目。现在您有一个映射,其键是所有在文件中出现多次的哈希码。其中大多数都是“哈希冲突”,但如果文件中有重复的字符串,它们的哈希码将在地图中。

最后,再次遍历文件。对于每个String,检查其哈希码是否在您之前准备的映射中。如果存在哈希码,则将String添加到Set。如果String已经在Set中,那么您已经找到了副本。如果地图中没有哈希码,只需删除字符串,因为你知道它不是重复的。

相关问题