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

Java实现单词频次统计时如何避免重复字符串输出?

问题原因

现有双重循环逻辑会遍历单词数组的每一个元素,每遍历到一个单词就全量统计一次该单词的出现次数,所以同一个单词出现多少次就会重复输出多少次统计结果,未做去重处理。

优化方案

推荐使用LinkedHashMap实现频次统计,天然支持去重,还能保证输出顺序和单词首次出现的顺序一致,完全匹配你给出的预期输出格式:

import java.util.LinkedHashMap;
import java.util.Map;

public static void printWordsOccurence(String str) {
    String[] words = str.split(" ");
    Map<String, Integer> countMap = new LinkedHashMap<>();

    // 统计单词频次
    for (String word : words) {
        countMap.put(word, countMap.getOrDefault(word, 0) + 1);
    }

    // 按要求格式输出
    int seq = 1;
    for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
        System.out.printf("%d. [%d] %s%n", seq, entry.getValue(), entry.getKey());
        seq++;
    }
}

如果你的JDK版本低于8,不支持getOrDefault方法,可以将统计逻辑替换为:

for (String word : words) {
    if (countMap.containsKey(word)) {
        countMap.put(word, countMap.get(word) + 1);
    } else {
        countMap.put(word, 1);
    }
}

如果你不想引入额外的集合类,坚持用双重循环实现,可以增加去重判断,遇到已经统计过的单词直接跳过:

public static void printWordsOccurence(String str) {
    String[] words = str.split(" ");
    int counter = 0;
    int seq = 1;

    for (int i = 0; i < words.length; i++) {
        // 判断当前单词是否已经在前面统计过
        boolean counted = false;
        for (int k = 0; k < i; k++) {
            if (words[i].equals(words[k])) {
                counted = true;
                break;
            }
        }
        if (counted) {
            continue;
        }
        
        // 统计当前单词频次
        for (int j = 0; j < words.length; j++) {
            if (words[i].equals(words[j])) {
                counter++;
            }
        }
        System.out.printf("%d. [%d] %s%n", seq, counter, words[i]);
        seq++;
        counter = 0;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:04