计算Java中10万个单词的频率需要多少时间

计算Java中10万个单词的频率需要多少时间,java,file,hashmap,frequency,Java,File,Hashmap,Frequency,我必须通读一个大约有10万个单词的文本文件,并创建一个包含每个单词频率的哈希图。到目前为止,我的代码执行大约需要15-20分钟,我猜我做错了什么。 该任务的执行时间是多少 这是我正在使用的代码 Scanner scanner = new Scanner(new FileReader("myFile.txt")); HashMap<String, Integer> wordFrequencies = new HashMap<>(); while (s

我必须通读一个大约有10万个单词的文本文件,并创建一个包含每个单词频率的哈希图。到目前为止,我的代码执行大约需要15-20分钟,我猜我做错了什么。 该任务的执行时间是多少

这是我正在使用的代码

    Scanner scanner = new Scanner(new FileReader("myFile.txt"));
    HashMap<String, Integer> wordFrequencies = new HashMap<>();
    while (scanner.hasNextLine()) {
        wordFrequencies.merge(scanner.next(), 1, (a, b) -> a + b);
    }
    return wordFrequencies;
Scanner Scanner=新的扫描仪(新的文件阅读器(“myFile.txt”);
HashMap wordFrequencies=新HashMap();
while(scanner.hasNextLine()){
合并(scanner.next(),1,(a,b)->a+b);
}
返回字频率;

这几乎不需要时间。比如,如果你只做了一次,你几乎不会注意到它所花费的时间。如果它需要20分钟,你每秒处理大约100个单词,这是糟糕的表现,即使你的单词真的很长

从的Javadoc(添加了强调):

通常,读取器发出的每个读取请求都会导致底层字符或字节流发出相应的读取请求因此,建议将BufferedReader包装在其read()操作可能代价高昂的任何读取器周围,例如文件读取器和InputStreamReaders

尝试将
文件读取器
包装到
缓冲读取器

Scanner scanner = new Scanner(new BufferedReader(new FileReader("myFile.txt")));

这几乎不需要时间。比如,如果你只做了一次,你几乎不会注意到它所花费的时间。如果它需要20分钟,你每秒处理大约100个单词,这是糟糕的表现,即使你的单词真的很长

从的Javadoc(添加了强调):

通常,读取器发出的每个读取请求都会导致底层字符或字节流发出相应的读取请求因此,建议将BufferedReader包装在其read()操作可能代价高昂的任何读取器周围,例如文件读取器和InputStreamReaders

尝试将
文件读取器
包装到
缓冲读取器

Scanner scanner = new Scanner(new BufferedReader(new FileReader("myFile.txt")));

不太相关,但若文件以空行结尾,那个么您就有潜在的问题
hasNextLine
将返回
true
,但
next
将抛出异常,因为那里没有令牌。在循环条件中使用
hasNext()
。尝试将循环的内容更改为只调用scanner.next()(或scanner.hasNext()),并增加一个计数器,然后在完成后返回计数器,并查看需要多长时间(计数器的作用是防止循环内部被优化。如果不需要很长时间,则尝试使用不同的逻辑来计算频率。这并不相关,但如果文件以空行结尾,则可能会出现问题。
hasNextLine
将返回
true
,但
next
将抛出异常,因为re将不存在令牌。在循环条件中使用
hasNext()
。尝试将循环内容更改为只调用scanner.next()(或scanner.hasNext()),并增加一个计数器,然后在完成后返回计数器,并查看需要多长时间(计数器的作用是防止循环内部被优化。如果不需要很长时间,那么尝试不同的逻辑来计算频率。安迪·特纳和@Bill的答案帮助我解决了很多问题。感谢安迪·特纳和@Bill的答案帮助我解决了很多问题。谢谢