Java二维String数组无法赋值:统计字符串出现次数问题求助
问题分析与修复方案
核心问题
- 二维数组未完整初始化:
String[][] allWords2 = new String[2][];仅创建了2行的外层容器,但每行的列数未定义,导致allWords2[0]和allWords2[1]均为null,直接赋值必然抛出NullPointerException。 - 逻辑判断完全错误:
wordsUsed = allWords[i];后判断!(wordsUsed.contains(allWords[i])),这永远为false——因为wordsUsed就是当前元素本身,必然包含自己,导致新元素永远无法被添加。 - 元素存在性判断错误:用
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
相关产品推荐
相关产品推荐

