
本文介绍如何正确统计字符串中不以数字开头的单词数量,指出原始代码逻辑错误,并提供基于`split()`方法的简洁解决方案。
在进行单词计数时,若需排除以数字开头的单词(如 "123"、"45test"),关键在于先准确切分单词,再逐个判断首字符。原始代码存在两个核心问题:
- 逻辑错位:在遍历空格时误将 i 作为单词首字符索引(Words.charAt(i) 实际是空格本身),导致 Character.isDigit() 判断永远为 false;
- 计数冗余:每次遇到空格就 WordCount++,但未处理末尾单词及连续空格等边界情况,且错误地在空格处再次递增计数。
推荐采用 String.split(" ") 方法进行语义化分词,再结合 Character.isDigit() 过滤首字符:
public static void main(String[] args) {
String words = "This is a test123 123";
int wordCount = 0;
String[] tokens = words.split(" ");
for (String word : tokens) {
// 跳过空字符串(如原字符串含连续空格或首尾空格)
if (word.isEmpty()) continue;
// 检查单词首字符是否为数字
if (!Character.isDigit(word.charAt(0))) {
wordCount++;
}
}
System.out.println("The number of words is " + wordCount); // 输出:4
}✅ 注意事项:
- split(" ") 对连续空格会产生空字符串,务必用 word.isEmpty() 过滤;
- 若需更鲁棒的分词(支持制表符、换行符等),建议使用 words.split("\\s+")(\\s+ 匹配任意空白字符);
- word.charAt(0) 在空字符串时会抛出 StringIndexOutOfBoundsException,因此空检查不可省略;
- 此方案时间复杂度为 O(n),清晰可读,优于手动遍历状态机实现。
通过分而治之——先分割、后过滤——即可精准实现“排除数字开头单词”的统计需求。
立即学习“Java免费学习笔记(深入)”;










