我有一个大文本文件(大小远高于1G),我想用Java来计算该文件中某个单词的外观。文件中的文本写在一行上,因此可能无法逐行检查。什么是解决这个问题的最佳方法?
答案 0 :(得分:2)
您希望使用Scanner类Java来逐字消耗该巨大文件。调用useDelimiter(...)方法一次,以配置单词的分割方式(可能只是空格字符),然后使用hasNext()和getNext()循环遍历文件内容。
对于计数本身,您可以使用HashMap来简化。
答案 1 :(得分:1)
您可以使用Trie数据结构的轻微变体。此DS用于创建单词词典。要搜索“堆栈”的示例,您可以通过传递“Sta”来搜索trie,它将返回以“Sta”开头的所有单词。
现在在你的问题中,你可以逐字遍历文件并将其放在trie中。为每个单词添加额外的字段'count'。现在,当您插入修改过的尝试时,您可以增加“计数”。现在你已经计算了特里的所有单词。
我认为内存使用量不应太多,因为1G文件中的大多数单词都会重复出现。您只需要遍历文件一次。而且,一旦你有这个特里,你可以搜索多个单词而不会造成性能损失。
编辑:
我必须同意@Bananeweizen,如果你需要完全匹配,HashMap也是一个很好的解决方案。所以逐字阅读并放入HashMap。内存使用量应与try相同。
答案 2 :(得分:0)
首先,您需要对单词进行排序,使其按字母顺序排列。在读取数据并在空格上分割单词后,有许多方法可以做到这一点。您还需要在排序之前删除特殊字符和标点符号。
排序后,您定位的字词将并排显示,这会使您的搜索成为O(N)问题。此时,您可以使用循环结构来比较每个单词,直到找到单词的第一个实例。此时,您继续循环,计算每个单词,直到您到达下一个单词。
此时,您知道您的收藏中不再有该单词的实例,您可以暂停搜索。
这种特殊的搜索算法是O(N)最坏的情况。如果你的单词是“苹果”,那么搜索的完成速度可能比你的单词“斑马”要快得多。
您可以选择其他算法,具体取决于您的具体需求。
我假设你的问题是这是一项编程工作而不是工作的实际问题。如果这是一个工作上的问题,那么这个问题已经无数次解决了,并且有很多Java的搜索库可以帮助你解决这个问题,包括Java标准库中的工具。
答案 3 :(得分:-2)
您可以使用外部工具构建一些文本索引。之后,您将能够快速找到此索引中的不同单词。 例如。你可以让Lucene建立这样的索引。然后简单地获得条款的频率。类似的问题counting the word frequency in lucene index包含文章和代码示例的链接。