Java字符串捕获超9个单词时出现数组异常问题求助
Java词频统计程序修复方案
问题根源分析
你遇到的问题核心是获取预期单词数的逻辑错误:
- 原代码通过
inputString.charAt(0)取第一个字符计算numWords,当单词数≥10时,第一个字符只是数字的第一位(比如输入"10 Hello World..."时,取到的是'1',numWords被错误计算为1),导致后续循环只处理1个单词。 - 额外还有两处冗余/低效问题:
- 先初始化
String[] words = new String[numWords];后立刻被split结果覆盖,属于无用代码。 - 双重循环统计词频的方式效率极低,重复统计相同单词的次数。
- 先初始化
修正后的代码
import java.util.HashMap; import java.util.Scanner; public class LabProgram { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); String inputString = scnr.nextLine(); String[] parts = inputString.split("\\s"); // 正确提取预期单词数量(从split后的第一个元素转整数) int numWords = Integer.parseInt(parts[0]); // 用HashMap统计词频,避免重复计算 HashMap<String, Integer> wordCount = new HashMap<>(); // 遍历从索引1开始的单词(跳过开头的数字) for (int i = 1; i <= numWords; i++) { String word = parts[i]; // 统计次数:存在则+1,不存在则设为1 wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); } // 按输入顺序输出去重后的词频结果 for (int i = 1; i <= numWords; i++) { String word = parts[i]; if (wordCount.containsKey(word)) { System.out.println(word + " - " + wordCount.get(word)); wordCount.remove(word); } } } }
关键改动说明
- 正确获取单词数:通过
parts[0](split后的第一个元素)转成整数,支持两位数及以上的单词数。 - HashMap优化统计逻辑:将原O(n²)的双重循环优化为O(n)的单次遍历,大幅提升效率。
- 去重输出:输出一次后从Map中移除对应单词,确保每个单词只显示一次统计结果。
内容的提问来源于stack exchange,提问作者JUNKJACKZACK
相关产品推荐
相关产品推荐

