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

Java二维String数组无法赋值:统计字符串出现次数问题求助

问题分析与修复方案

核心问题

  1. 二维数组未完整初始化:String[][] allWords2 = new String[2][];仅创建了2行的外层容器,但每行的列数未定义,导致allWords2[0]和allWords2[1]均为null,直接赋值必然抛出NullPointerException。
  2. 逻辑判断完全错误:wordsUsed = allWords[i];后判断!(wordsUsed.contains(allWords[i])),这永远为false——因为wordsUsed就是当前元素本身,必然包含自己,导致新元素永远无法被添加。
  3. 元素存在性判断错误:用contains判断元素是否存在是错误的,contains是检查子串而非数组/列表中是否存在该元素;且Arrays.asList(allWords2[0])在数组未初始化时会生成空列表,indexOf返回-1,后续操作会触发数组越界。

修复代码

由于一开始无法确定唯一元素的数量,先用List临时存储唯一元素和对应次数,最后再转成二维数组,同时过滤split产生的空字符串:

public lexNode() throws IOException {
    path = "src\\words.txt"; // 注意转义反斜杠,避免被解析为转义字符
    String content = Files.readString(Paths.get(path), StandardCharsets.UTF_8);
    String[] allWords = content.split("[^a-zA-Z]+");
    
    // 用List临时存储唯一单词和次数,避开数组长度固定的限制
    List<String> uniqueWords = new ArrayList<>();
    List<Integer> countList = new ArrayList<>();

    for (String word : allWords) {
        // 过滤split产生的空字符串
        if (word.isEmpty()) {
            continue;
        }
        // 检查当前单词是否已在列表中
        int index = uniqueWords.indexOf(word);
        if (index == -1) {
            // 新单词,添加到列表,次数设为1
            uniqueWords.add(word);
            countList.add(1);
        } else {
            // 已有单词,次数+1
            countList.set(index, countList.get(index) + 1);
        }
    }

    // 将List转为目标二维数组
    String[][] allWords2 = new String[2][uniqueWords.size()];
    // 第一行存唯一单词
    for (int i = 0; i < uniqueWords.size(); i++) {
        allWords2[0][i] = uniqueWords.get(i);
    }
    // 第二行存次数(转成String)
    for (int i = 0; i < countList.size(); i++) {
        allWords2[1][i] = String.valueOf(countList.get(i));
    }
}

额外说明

关于你提到的HashMap查找失败问题,大概率是以下原因:

  • 未过滤split产生的空字符串,导致空字符串作为键出现异常;
  • 存在大小写差异(比如"Hello"和"hello"被视为不同键),若需忽略大小写,可将单词转为小写/大写后再存入HashMap;
  • 错误使用了contains而非containsKey判断键是否存在。若后续想尝试HashMap,可参考以下简化写法:
Map<String, Integer> wordCount = new HashMap<>();
for (String word : allWords) {
    if (word.isEmpty()) continue;
    // 若需忽略大小写,改为word.toLowerCase()
    wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
// 再将HashMap转为二维数组即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:15:56