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

Java不使用HashMap等结构统计List单词次数并去重、去除标点

实现思路及修改方案

1. 单词标点清理实现

你可以单独写一个辅助方法处理输入的单词,过滤指定标点,不需要用到split方法:

  • 先定义需要移除的标点字符串:String invalidSymbols = ",.:[];=-"
  • 遍历原单词的每一个字符,只要不在上述标点集合里的字符就保留,拼接成纯净的新单词
  • 可额外添加大小写统一逻辑,避免Hello和hello被判定为不同单词

对应辅助方法代码:

private static String cleanWord(String rawWord) {
    String invalidSymbols = ",.:[];=-";
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < rawWord.length(); i++) {
        char c = rawWord.charAt(i);
        // 不在标点集合里的字符就保留
        if (invalidSymbols.indexOf(c) == -1) {
            sb.append(c);
        }
    }
    // 可选:统一转小写,按需开启
    // return sb.toString().toLowerCase();
    return sb.toString();
}

2. 原有统计逻辑修复

你原有代码存在逻辑错误:numCount.indexOf(word) 是在存储整数的计数列表里查找字符串,永远会返回-1,无法正确获取单词对应的下标。需要替换为从单词列表wordCount中查找下标。

3. 完整可运行代码

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class WordCount {
    private static String cleanWord(String rawWord) {
        String invalidSymbols = ",.:[];=-";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < rawWord.length(); i++) {
            char c = rawWord.charAt(i);
            if (invalidSymbols.indexOf(c) == -1) {
                sb.append(c);
            }
        }
        // 如果不需要区分大小写,打开下面的注释即可
        // return sb.toString().toLowerCase();
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        // 创建输入流
        FileInputStream file = new FileInputStream("Assignment1BData.txt");
        Scanner input = new Scanner(file);

        ArrayList<String> wordList = new ArrayList<>();
        ArrayList<Integer> countList = new ArrayList<>();

        while (input.hasNext()) {
            String rawWord = input.next();
            // 先清理单词的标点
            String cleanWord = cleanWord(rawWord);
            // 空字符串直接跳过
            if (cleanWord.isEmpty()) {
                continue;
            }
            // 判断单词是否已经存在
            if (wordList.contains(cleanWord)) {
                // 从单词列表获取下标,更新计数
                int index = wordList.indexOf(cleanWord);
                countList.set(index, countList.get(index) + 1);
            } else {
                wordList.add(cleanWord);
                countList.add(1);
            }
        }
        input.close();
        file.close();

        // 输出结果
        for (int i = 0; i < wordList.size(); i++) {
            System.out.println(wordList.get(i) + " = " + countList.get(i));
        }
    }
}

上述实现完全符合要求:没有使用任何哈希相关类、没有用到split方法,同时完成了标点清理、单词去重、出现次数统计的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:09:02