0

0

如何在Java中准确统计字符串的单词数、字母数、数字数及特殊字符数

花韻仙語

花韻仙語

发布时间:2026-03-01 19:26:01

|

134人浏览过

|

来源于php中文网

原创

如何在Java中准确统计字符串的单词数、字母数、数字数及特殊字符数

本文详解如何基于String.split()和Unicode码点技术,高效统计输入字符串中的单词数量、英文字母、数字及非字母数字字符,避免常见循环内重复分割等性能陷阱。

本文详解如何基于`string.split()`和unicode码点技术,高效统计输入字符串中的单词数量、英文字母、数字及非字母数字字符,避免常见循环内重复分割等性能陷阱。

在Java中对字符串进行多维度字符统计(如单词数、字母数、数字数、标点/空格等特殊字符数)是一项基础但易出错的任务。初学者常误将split()置于循环内部反复调用,或依赖char类型处理Unicode字符(如 emoji、中文、带重音符号的拉丁字母),导致逻辑错误与结果偏差。本文提供一套健壮、可扩展、符合现代Java实践的完整解决方案。

✅ 正确统计单词数:使用 split(" ") + strip()

单词统计的核心在于合理分词。最直接的方式是按空格分割字符串:

String[] words = input.split(" ");
int wordCount = words.length;

⚠️ 注意:split(" ") 会保留空字符串(如连续空格或首尾空格导致的空项)。为提升鲁棒性,应先对每个分割后的子串调用 .strip() 去除首尾空白,再过滤空串(可选):

// 更严谨的做法:过滤掉空单词
long wordCount = Arrays.stream(words)
    .map(String::strip)
    .filter(s -> !s.isEmpty())
    .count();

但在多数教学与简单场景中,split(" ").length 已足够;若需严格语义分词(如忽略标点影响),建议使用正则 split("\s+") 并配合 strip()。

立即学习Java免费学习笔记(深入)”;

Fotor AI Image Generator
Fotor AI Image Generator

Fotor 平台的 AI 图片生成器

下载

✅ 精确统计字母与数字:基于 Unicode 码点(Code Point)

Java 中 char 是16位UTF-16单元,无法完整表示超出BMP平面的字符(如 ?、?‍?、é、α)。因此,必须使用 String.codePoints() 获取真正的Unicode码点整数,再通过 Character.isLetter() / Character.isDigit() 判断:

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

⚠️ 关键注意事项总结

  • 勿在循环中调用 split():str.split(" ") 是O(n)操作,放在for (i=0; i
  • 慎用 char,优先用 codePoint:尤其当输入可能含中文、emoji、德语变音符等时,charAt(i) 可能返回代理对(surrogate pair)的半截值,造成误判。
  • 空格处理要明确:本方案将空格视为分词依据而非待统计“字符”;若需统计空格数,应在原始字符串中单独遍历 Character.isWhitespace(cp)。
  • 标点归属需按需定义:当前将逗号、感叹号、@、# 等归入 otherCount;如需进一步细分(如仅统计标点),可使用 Character.getType(cp) == Character.OTHER_PUNCTUATION。

掌握这套基于 split() + codePoints() 的组合模式,你不仅能正确解决单词与字符分类统计问题,更能写出面向真实世界多语言文本的健壮Java代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

890

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1088

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1042

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

187

2025.07.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 74.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号