You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
            }
        }
    }
}

关键改动说明

  1. 正确获取单词数:通过parts[0](split后的第一个元素)转成整数,支持两位数及以上的单词数。
  2. HashMap优化统计逻辑:将原O(n²)的双重循环优化为O(n)的单次遍历,大幅提升效率。
  3. 去重输出:输出一次后从Map中移除对应单词,确保每个单词只显示一次统计结果。

内容的提问来源于stack exchange,提问作者JUNKJACKZACK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:12:51