讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Java中统计字符串中独立单词的数量

夜伟小哥_1191

夜伟小哥_1191

发布时间:2025-11-15 12:53:02

|

812人浏览过

|

来源于php中文网

原创

java中统计字符串中独立单词的数量

本教程详细介绍了如何在Java中实现一个方法,用于统计给定字符串中不重复单词的数量。我们将通过字符串分割、单词标准化(如转换为小写并去除标点)以及使用`ArrayList`来存储和检查单词的唯一性,最终返回独立单词的总数,避免使用如`HashSet`等高级集合类型。

在Java编程中,经常会遇到需要处理文本数据并从中提取特定信息的需求。其中一个常见任务是统计一个字符串中包含多少个独特的单词。例如,对于句子 "A long long time ago, I can still remember",我们希望得到的结果是 8(因为 "long" 出现了两次,但只应计算一次)。本教程将指导您如何构建一个方法来实现这一功能,同时遵循不使用高级集合类型(如 HashSet)的限制,而是利用基础的 ArrayList。

1. 理解核心问题与限制

核心问题是区分重复单词和独立单词。一个简单的单词计数器会计算所有出现的单词,而我们需要的是只计算第一次出现的单词。原始问题中明确指出,不允许使用 HashSet 或 HashMap 等高级数据结构,这使得我们必须依赖更基础的集合类,例如 ArrayList。

2. 实现思路

要解决这个问题,我们可以遵循以下步骤:

多语言产品描述批量生成SEO
多语言产品描述批量生成SEO

为跨境电子商务生成多语言、SEO 优化的产品描述。支持英语、西班牙语、俄语和阿拉伯语,并针对不同搜索引擎(Google / Bing、Yandex、中东市场)进行专项 SEO 优化。适用于以下场景:用户需为国际市场创建符合 SEO 规范的产品文案、批量生成产品描述,或针对特定搜索引擎及区域用户偏好优化内容。

下载

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

  1. 将字符串分割成单词: 使用字符串的 split() 方法根据空格或其他分隔符将句子分解成单个单词。
  2. 标准化单词: 在比较单词之前,需要对它们进行标准化处理。这通常包括:
    • 将所有单词转换为统一的大小写(例如,全部转为小写),以确保 "Word" 和 "word" 被视为同一个单词。
    • 去除单词中的标点符号,例如 "ago," 应该被处理成 "ago"。
  3. 存储和检查唯一性: 使用一个 ArrayList 来存储已经遇到的独特单词。在遍历分割后的单词时,对于每个单词,先检查它是否已经存在于 ArrayList 中。如果不存在,则将其添加到列表中。

3. 代码实现

下面是一个完整的Java方法,它实现了上述逻辑:

import java.util.ArrayList;
import java.util.List;

public class WordCounter {

    /**
     * 统计字符串中独立单词的数量。
     * 该方法将字符串分割成单词,对单词进行标准化处理(转小写并去除标点),
     * 然后使用ArrayList来存储和检查单词的唯一性。
     *
     * @param s 输入的字符串
     * @return 字符串中独立单词的数量
     */
    public static int countUniqueWords(String s) {
        if (s == null || s.trim().isEmpty()) {
            return 0;
        }

        // 1. 将字符串分割成单词
        // 使用正则表达式匹配一个或多个空格作为分隔符
        // 这将处理多个空格的情况,并避免生成空字符串
        String[] words = s.split("\s+"); 

        List<String> uniqueWords = new ArrayList<>();

        for (String word : words) {
            // 2. 标准化单词:
            // a. 去除单词中的非字母字符(标点符号、数字等)
            //    replaceAll("[^a-zA-Z]", "") 会移除所有非英文字母字符
            // b. 转换为小写,确保大小写不敏感的比较
            String cleanedWord = word.replaceAll("[^a-zA-Z]", "").toLowerCase();

            // 检查处理后的单词是否为空,例如,如果原始字符串中只有标点符号
            if (!cleanedWord.isEmpty()) {
                // 3. 存储和检查唯一性
                // 如果uniqueWords列表中不包含当前处理后的单词,则将其添加进去
                if (!uniqueWords.contains(cleanedWord)) {
                    uniqueWords.add(cleanedWord);
                }
            }
        }
        return uniqueWords.size();
    }

    public static void main(String[] args) {
        String sentence1 = "A long long time ago, I can still remember";
        String sentence2 = "Hello world! Hello Java, world!";
        String sentence3 = "  Only one word ";
        String sentence4 = "   "; // 空白字符串
        String sentence5 = "Java, Java, java.";

        System.out.println("Sentence 1: "" + sentence1 + "" -> Unique words: " + countUniqueWords(sentence1)); // 期望输出 8
        System.out.println("Sentence 2: "" + sentence2 + "" -> Unique words: " + countUniqueWords(sentence2)); // 期望输出 4 (hello, world, java)
        System.out.println("Sentence 3: "" + sentence3 + "" -> Unique words: " + countUniqueWords(sentence3)); // 期望输出 3 (only, one, word)
        System.out.println("Sentence 4: "" + sentence4 + "" -> Unique words: " + countUniqueWords(sentence4)); // 期望输出 0
        System.out.println("Sentence 5: "" + sentence5 + "" -> Unique words: " + countUniqueWords(sentence5)); // 期望输出 1 (java)
    }
}

4. 示例运行与输出

使用上述 main 方法运行代码,您将得到以下输出:

Sentence 1: "A long long time ago, I can still remember" -> Unique words: 8
Sentence 2: "Hello world! Hello Java, world!" -> Unique words: 4
Sentence 3: "  Only one word " -> Unique words: 3
Sentence 4: "   " -> Unique words: 0
Sentence 5: "Java, Java, java." -> Unique words: 1

5. 注意事项与性能考量

  • split() 方法: s.split("\s+") 使用正则表达式 s+ 来匹配一个或多个空白字符。这比 s.split(" ") 更健壮,可以正确处理单词之间有多个空格的情况,避免产生空的单词字符串。
  • 单词标准化: word.replaceAll("[^a-zA-Z]", "").toLowerCase() 是一个通用的标准化方法。[^a-zA-Z] 匹配任何非英文字母的字符,并将其替换为空字符串。toLowerCase() 则将所有字母转换为小写。根据具体需求,您可能需要调整正则表达式以包含数字或其他特定字符。
  • 性能: ArrayList.contains() 方法在最坏情况下需要遍历整个列表来查找元素,其时间复杂度为 O(n),其中 n 是列表中元素的数量。因此,对于非常大的文本,这种方法的性能可能不如使用 HashSet(其平均时间复杂度为 O(1))。然而,考虑到原始问题中对数据结构的限制,ArrayList 是一个合理的选择。
  • 空字符串/只有标点符号的单词: 在 cleanedWord.isEmpty() 检查中,我们确保只处理有效(非空)的单词。例如,如果原始字符串中有一个逗号 ,,经过 replaceAll 后会变成空字符串,我们不应将其计入独特单词。
  • 多语言支持: 当前的 replaceAll("[^a-zA-Z]", "") 仅处理英文字母。如果需要支持其他语言(如中文、法文等),则需要调整正则表达式来匹配相应的字符集。

6. 总结

通过本教程,我们学习了如何使用Java的基本字符串操作和 ArrayList 来实现一个方法,以统计字符串中独立单词的数量。这个方法通过字符串分割、单词标准化和列表的唯一性检查,有效地解决了在不使用高级集合类的情况下处理文本去重的问题。尽管在处理大规模数据时可能存在性能瓶颈,但它为理解和实现基础的文本处理逻辑提供了一个清晰的范例。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4996

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3461

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9662

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

540

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn