本文详解如何基于String.split()和Unicode码点技术,高效统计输入字符串中的单词数量、英文字母、数字及非字母数字字符,避免常见循环内重复分割等性能陷阱。
本文详解如何基于`string.split()`和unicode码点技术,高效统计输入字符串中的单词数量、英文字母、数字及非字母数字字符,避免常见循环内重复分割等性能陷阱。
在Java中对字符串进行多维度字符统计(如单词数、字母数、数字数、标点/空格等特殊字符数)是一项基础但易出错的任务。初学者常误将split()置于循环内部反复调用,或依赖char类型处理Unicode字符(如 emoji、中文、带重音符号的拉丁字母),导致逻辑错误与结果偏差。本文提供一套健壮、可扩展、符合现代Java实践的完整解决方案。
✅ 正确统计单词数:使用 split(" ") + strip()
单词统计的核心在于
合理分词
。最直接的方式是按空格分割字符串:
⚠️ 注意:split(" ") 会保留空字符串(如连续空格或首尾空格导致的空项)。为提升鲁棒性,应先对每个分割后的子串调用 .strip() 去除首尾空白,再过滤空串(可选):
但在多数教学与简单场景中,split(" ").length 已足够;若需严格语义分词(如忽略标点影响),建议使用正则 split("\s+") 并配合 strip()。
立即学习
“
Java免费学习笔记(深入)
”;
✅ 精确统计字母与数字:基于 Unicode 码点(Code Point)
Java 中 char 是16位UTF-16单元,无法完整表示超出BMP平面的字符(如 ?、??、é、α)。因此,
必须使用 String.codePoints() 获取真正的Unicode码点整数
,再通过 Character.isLetter() / Character.isDigit() 判断:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
该方式天然支持国际化文本,且语义清晰、无编码隐患。
✅ 完整可运行示例
以下是一个结构清晰、注释完备的完整程序,整合了单词、字母、数字、其他字符四类统计:
输出示例:
⚠️ 关键注意事项总结
勿在循环中调用 split()
:str.split(" ") 是O(n)操作,放在for (i=0; i
String[] words = input.split(" ");
int wordCount = words.length;// 更严谨的做法:过滤掉空单词
long wordCount = Arrays.stream(words)
.map(String::strip)
.filter(s -> !s.isEmpty())
.count();for (String word : words) {
String cleanWord = word.strip();
cleanWord.codePoints().forEach(codePoint -> {
if (Character.isLetter(codePoint)) {
letterCount++;
} else if (Character.isDigit(codePoint)) {
digitCount++;
} else {
otherCount++; // 包含标点、空格(已strip,此处为空格外的非字母数字字符)、符号等
}
});
}package work.basil.example.text;
import java.util.Arrays;
public class TextAnalyzer {
public static void main(String[] args) {
TextAnalyzer analyzer = new TextAnalyzer();
analyzer.analyze("Hello, 世界! 123 test@#");
}
public void analyze(String input) {
System.out.println("输入字符串: "" + input + """);
// 1. 分词(按空格)
String[] words = input.split(" ");
long wordCount = Arrays.stream(words)
.map(String::strip)
.filter(s -> !s.isEmpty())
.count();
// 2. 初始化计数器
long letterCount = 0, digitCount = 0, otherCount = 0;
// 3. 遍历每个单词,逐码点分析
for (String word : words) {
String w = word.strip();
if (w.isEmpty()) continue;
w.codePoints().forEach(cp -> {
if (Character.isLetter(cp)) letterCount++;
else if (Character.isDigit(cp)) digitCount++;
else otherCount++;
});
}
// 4. 输出结果
System.out.println("→ 单词数: " + wordCount);
System.out.println("→ 字母数: " + letterCount);
System.out.println("→ 数字数: " + digitCount);
System.out.println("→ 其他字符数: " + otherCount);
System.out.println("→ 总字符数(不含空格): " + (letterCount + digitCount + otherCount));
}
}输入字符串: "Hello, 世界! 123 test@#"
→ 单词数: 4
→ 字母数: 11 // H,e,l,l,o,t,e,s,t
→ 数字数: 3 // 1,2,3
→ 其他字符数: 7 // ,,!,世,界,@,#
→ 总字符数(不含空格): 21