Java中修改单词频率统计代码:实现按行去重统计
调整Java代码实现按行去重统计单词出现行数
当然可以!你的需求是把原本统计整个文档中单词总出现次数的逻辑,改成每行内同一单词仅统计一次(也就是最终统计每个单词在多少不同的行中出现过,而非总出现次数)对吧?我帮你调整了代码,同时修复了原代码里的一些小问题(比如原代码用sc.next()后又按空格拆分是多余的,sc.next()本身就会按空格分隔取单词)。
修改后的代码
import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Scanner; import java.util.Set; public class WordLineCounter { public static void main(String[] args) { // 用于记录每个单词出现的行数 Map<String, Integer> wordLineCount = new HashMap<>(); File file = new File("filename.txt"); try (Scanner scanner = new Scanner(file)) { // 逐行读取文档 while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (line.isEmpty()) { continue; // 跳过空行 } // 按空格拆分该行的单词(处理多个连续空格的情况) String[] wordsInLine = line.split("\\s+"); // 用Set对当前行的单词去重,确保同一行内同一单词只算一次 Set<String> uniqueWordsInLine = new HashSet<>(); for (String word : wordsInLine) { // 可选:统一转为小写,避免大小写差异(比如Hello和hello算同一个单词) String normalizedWord = word.toLowerCase(); uniqueWordsInLine.add(normalizedWord); } // 更新全局的单词行数统计 for (String word : uniqueWordsInLine) { wordLineCount.put(word, wordLineCount.getOrDefault(word, 0) + 1); } } // 输出统计结果 System.out.println("单词及其出现的行数:"); for (Map.Entry<String, Integer> entry : wordLineCount.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue() + " 行"); } } catch (Exception e) { System.out.println("文件未找到或读取错误:" + e.getMessage()); } } }
关键修改点说明
- 逐行读取:改用
scanner.hasNextLine()和scanner.nextLine(),这样能完整处理每一行的内容,方便对行内单词去重 - 行内去重:用
HashSet存储当前行的单词,自动过滤掉同一行内重复的单词 - 统计行数:用
HashMap记录每个单词出现在多少行中,每处理一行去重后的单词,就对应单词的计数+1 - 优化细节:
- 处理了空行的情况,避免无效统计
- 加入了单词小写归一化(可选),消除大小写带来的统计差异
- 用
try-with-resources自动关闭Scanner,避免资源泄漏 - 优化了错误提示,显示具体的异常信息
内容的提问来源于stack exchange,提问作者CodingIsHardMan
相关产品推荐
相关产品推荐

