Java中处理文本重复词:高效检测、移除与格式化输出教程

Java中处理文本重复词:高效检测、移除与格式化输出教程

本教程旨在解决Java中识别并移除句子中连续重复词的问题,并以指定格式输出处理结果。我们将探讨如何避免在循环中直接打印,转而利用StringBuilder等数据结构高效构建修正后的字符串,并通过比较原始与修正后的句子来判断是否存在重复,最终实现清晰、专业的输出。

问题解析:循环中的输出陷阱

在处理文本或任何数据集合时,开发者常遇到的一个挑战是如何在循环迭代过程中,根据累积的结果或最终状态进行统一的输出。原始代码尝试在检测到重复词时立即打印提示信息,这导致了两个主要问题:

重复打印提示: 如果在内层循环中发现重复并打印“有重复”或“无重复”,那么每次循环迭代都可能触发打印,导致输出混乱且不符合预期。不准确的判断: 在循环中,我们可能无法得知整个处理过程是否已经结束,或者是否还有其他重复词。例如,在第一个重复词被处理后,就立即打印“有重复”,这可能与最终的整体判断不符,并且无法在所有处理完成后再统一输出修正后的句子。

核心需求是:程序需要先完整地分析整个句子,识别所有连续重复的词,构建一个修正后的句子,然后根据原始句子与修正后句子的对比结果,一次性地输出带有特定格式的提示信息。

核心策略:结果累积与状态管理

解决上述问题的关键在于将“处理逻辑”与“输出逻辑”进行分离。我们不应在处理数据的循环中直接进行最终的输出,而是应该:

累积处理结果: 在循环过程中,将符合条件的、经过处理的有效数据片段(例如,非重复的单词)收集起来,存储到一个合适的数据结构中。管理处理状态: 使用一个布尔标志(如repetitionsFound)来记录在整个处理过程中是否检测到了任何需要报告的事件(例如,是否存在重复词)。统一输出: 在所有数据处理完毕后,根据累积的结果和管理的状态,进行一次性、格式化的输出。

这种模式确保了输出的准确性和清晰性,避免了在中间步骤产生不必要的干扰。

方法一:使用StringBuilder高效构建修正句子

StringBuilder是Java中用于构建和修改字符串的推荐类,尤其在需要进行大量字符串拼接操作时,其性能远优于直接使用String的+运算符。

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

算法设计

拆分句子: 将输入的句子通过空格拆分为单词数组。遍历与判断: 遍历单词数组。对于每个单词,判断它是否与其紧邻的下一个单词相同。如果当前单词是句子中的最后一个词,或者当前词与下一个词不相同,则说明当前词是有效的,应将其添加到StringBuilder中。如果当前词与下一个词相同(即发现连续重复),则应该跳过下一个词(因为它是重复的),同时设置一个标志位表明已发现重复。构建修正句子: 将非重复的单词逐个添加到StringBuilder中,并在单词之间添加空格。最终判断与输出: 遍历结束后,将StringBuilder转换为最终的修正字符串。通过比较原始句子与修正后的句子,或检查标志位,来确定是否需要打印“有重复”的提示,并最终输出修正后的句子。

示例代码

以下是一个实现了上述逻辑的Java类:

import java.util.Objects; // For Objects.equals() which handles nulls gracefullypublic class SentenceProcessor {    private String originalSentence;    public SentenceProcessor(String sentence) {        // 对输入句子进行非空检查和trim处理,提高健壮性        this.originalSentence = Objects.requireNonNull(sentence, "Sentence cannot be null").trim();    }    /**     * 处理句子,移除连续重复的单词,并按照指定格式输出结果。     * @return 修正后的句子字符串。     */    public String processAndOutput() {        // 如果原始句子为空,直接返回空字符串并输出无重复信息        if (originalSentence.isEmpty()) {            System.out.println("There are no wrong repetitions");            return "";        }        // 将句子拆分为单词数组        // 使用正则表达式 "s+" 可以处理多个连续空格的情况        String[] words = originalSentence.split("s+");        StringBuilder correctedSentenceBuilder = new StringBuilder();        boolean repetitionsFound = false; // 标志位,用于记录是否发现连续重复词        // 遍历单词数组        for (int i = 0; i < words.length; i++) {            String currentWord = words[i];            // 判断是否为最后一个单词,或当前词与下一个词不连续重复            // 如果是最后一个词,或者当前词与下一个词不相等,则当前词是有效的            if (i == words.length - 1 || !currentWord.equalsIgnoreCase(words[i + 1])) {                correctedSentenceBuilder.append(currentWord);                // 如果不是最后一个有效词,则在其后添加空格                if (i < words.length - 1) {                    // 检查下一个词是否会被跳过,如果下一个词会被跳过,则不加空格                    // 否则,正常添加空格                    if (i + 1 < words.length && currentWord.equalsIgnoreCase(words[i + 1])) {                        // 如果下一个词是重复的,并且会被跳过,这里不加空格,因为我们i会跳过它                        // 但为了避免在builder末尾留下多余空格,统一在最后trim                    } else {                        correctedSentenceBuilder.append(" ");                    }                }            } else {                // 发现连续重复词:当前词与下一个词相同                repetitionsFound = true; // 设置标志位                i++; // 跳过下一个重复的词            }        }        // 将StringBuilder转换为最终的修正句子,并去除可能存在的末尾空格        String correctedSentence = correctedSentenceBuilder.toString().trim();        // 根据repetitionsFound标志位决定输出信息        if (repetitionsFound) {            System.out.println("The sentence includes wrong repetitions.");            System.out.println("The sentence should be: " + correctedSentence);        } else {            System.out.println("There are no wrong repetitions");        }        return correctedSentence; // 返回修正后的句子    }    // 示例用法    public static void main(String[] args) {        System.out.println("--- Test Case 1 ---");        SentenceProcessor processor1 = new SentenceProcessor("The operator did not not skip his meal");        processor1.processAndOutput();        // Expected Output:        // The sentence includes wrong repetitions.        // The sentence should be: The operator did not skip his meal        System.out.println("--- Test Case 2 ---");        SentenceProcessor processor2 = new SentenceProcessor("Happy people live longer");        processor2.processAndOutput();        // Expected Output:        // There are no wrong repetitions        System.out.println("--- Test Case 3 ---");        SentenceProcessor processor3 = new SentenceProcessor("This is an invalid invalid sentence that that needs corrected");        processor3.processAndOutput();        // Expected Output:        // The sentence includes wrong repetitions.        // The sentence should be: This is an invalid sentence that needs corrected        System.out.println("--- Test Case 4 (Empty/Single word) ---");        SentenceProcessor processor4 = new SentenceProcessor("");        processor4.processAndOutput(); // Handles empty string        SentenceProcessor processor5 = new SentenceProcessor("Hello");        processor5.processAndOutput(); // Handles single word        System.out.println("--- Test Case 5 (Case Insensitive) ---");        SentenceProcessor processor6 = new SentenceProcessor("Hello hello World");        processor6.processAndOutput(); // Handles case-insensitive check    }}

代码解析

originalSentence.split(“s+”): 使用正则表达式”s+”来拆分句子,这比简单的” “更健壮,可以处理多个连续空格的情况。StringBuilder correctedSentenceBuilder: 用于动态构建修正后的句子,避免了频繁创建String对象。boolean repetitionsFound: 这是一个关键的状态标志。它在循环开始时初始化为false,一旦发现任何连续重复词,就将其设置为true。这样,在循环结束后,我们只需检查这个标志即可知道是否有重复。for (int i = 0; i < words.length; i++): 遍历单词数组。currentWord.equalsIgnoreCase(words[i + 1]): 使用equalsIgnoreCase进行大小写不敏感的比较,这通常更符合用户对“重复词”的理解。如果需要大小写敏感,则使用equals。if (i == words.length – 1 || !currentWord.equalsIgnoreCase(words[i + 1])): 这是核心逻辑。它判断当前词是否应该被添加到correctedSentenceBuilder中。i == words.length – 1: 如果是最后一个词,它不可能有后续的重复词,所以总是有效的。!currentWord.equalsIgnoreCase(words[i + 1]): 如果当前词与下一个词不相同,那么当前词是有效的。correctedSentenceBuilder.append(” “);: 在添加每个有效词后,如果不是最后一个词,则添加一个空格。else { repetitionsFound = true; i++; }: 如果发现连续重复(即当前词与下一个词相同),则将repetitionsFound设置为true,并通过i++跳过下一个重复词,从而有效地“移除”它。correctedSentenceBuilder.toString().trim(): 在循环结束后,将StringBuilder的内容转换为String,并使用trim()方法去除可能存在的末尾空格。最终输出逻辑: 根据repetitionsFound的值,打印相应的提示信息和修正后的句子。

方法二:使用ArrayList存储单词

除了StringBuilder,我们也可以使用ArrayList来存储非重复的单词,最后再将列表中的单词拼接成一个字符串。

示例代码片段

import java.util.ArrayList;import java.util.List;import java.util.Objects;public class SentenceProcessorWithList {    private String originalSentence;    public SentenceProcessorWithList(String sentence) {        this.originalSentence = Objects.requireNonNull(sentence, "Sentence cannot be null").trim();    }    public String processAndOutput() {        if (originalSentence.isEmpty()) {            System.out.println("There are no wrong repetitions");            return "";        }        String[] words = originalSentence.split("s+");        List validWords = new ArrayList(); // 使用ArrayList存储有效单词        boolean repetitionsFound = false;        for (int i = 0; i < words.length; i++) {            String currentWord = words[i];            // 同样判断是否为最后一个单词,或当前词与下一个词不连续重复            if (i == words.length - 1 || !currentWord.equalsIgnoreCase(words[i + 1])) {                validWords.add(currentWord); // 添加到列表中            } else {                repetitionsFound = true;                i++; // 跳过下一个重复的词            }        }        // 使用String.join()将列表中的单词拼接成一个字符串        String correctedSentence = String.join(" ", validWords);        if (repetitionsFound) {            System.out.println("The sentence includes wrong repetitions.");            System.out.println("The sentence should be: " + correctedSentence);        } else {            System.out.println("There are no wrong repetitions");        }        return correctedSentence;    }    public static void main(String[] args) {        System.out.println("--- Test Case (ArrayList) ---");        SentenceProcessorWithList processor = new SentenceProcessorWithList("The operator did not not skip his meal");        processor.processAndOutput();    }}

优缺点对比

StringBuilder:优点: 在处理大量字符串拼接时通常性能更优,因为它直接操作字符数组。缺点: 逻辑相对紧凑,如果需要对中间的单词列表进行额外操作,可能不如ArrayList直观。ArrayList:优点: 存储单词列表更直观,方便进行后续的列表操作(如排序、过滤等),最后通过String.join()拼接非常简洁。缺点: 在极端大量的单词拼接场景下,String.join()内部可能仍涉及多次字符串创建,性能略低于StringBuilder(但对于一般句子长度,差异可忽略)。

两种方法都能有效解决问题,开发者可以根据个人偏好和具体场景选择。对于本例,两者都非常适用。

注意事项与最佳实践

边界条件处理:空句子或只含空格的句子: 在代码开头进行检查,避免split()产生空数组或不期望的结果。单词句子: 确保循环逻辑能正确处理只有一个词的句子,它不应被标记为有重复。句子末尾重复词: i == words.length – 1的判断确保了最后一个词的正确处理。大小写敏感性: 根据需求选择equals()(大小写敏感)或equalsIgnoreCase()(大小写不敏感)。本教程示例采用了equalsIgnoreCase(),通常更符合自然语言处理的预期。标点符号处理: 示例代码使用split(“s+”)按空格拆分。如果句子包含标点符号(如”meal.”),这些标点会附着在单词上。更复杂的场景可能需要使用正则表达式预处理句子以去除标点,或使用更精细的分词器。分离职责: 将核心的“检测和构建修正句子”逻辑与“输出结果”逻辑分离开来。processAndOutput()方法既处理又输出,但在实际应用中,通常会有一个方法负责返回修正后的句子(如getCorrectedSentence()),另一个方法负责根据结果进行输出。健壮性: 对输入参数进行非空检查,避免NullPointerException。

总结

本教程详细探讨了在Java中处理文本连续重复词的问题,并提供了一种高效且结构清晰的解决方案。核心思想在于将数据处理过程中的中间结果累积起来,并通过一个状态标志来记录关键事件,最终在所有处理完成后进行一次性、格式化的输出。通过使用StringBuilder或ArrayList,我们能够有效地构建修正后的字符串,同时避免了在循环中直接打印导致的混乱。掌握这种“结果累积与状态管理”的模式,对于解决各类涉及循环处理和统一输出的编程问题都具有重要的指导意义。

以上就是Java中处理文本重复词:高效检测、移除与格式化输出教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/93007.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月19日 03:29:31
Win7旗舰版注销时出现黑屏怎么解决?
下一篇 2025年11月19日 03:31:33

相关推荐

  • 如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    要阻止linux系统中特定软件包更新,可针对不同发行版使用相应方法。对于rhel/centos系系统,可通过在/etc/yum.conf或.repo文件中添加exclude=包名来排除升级;对于debian/ubuntu系系统,则使用sudo apt-mark hold 包名命令锁定版本。这两种方式…

    2026年9月21日 用户投稿
    400
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 用户投稿
    000
  • 如何在Krita导出AI生成的8K艺术图片?保存超高清图像方法

    答案是优先选择PNG格式导出8K AI艺术作品,确保画布为8K分辨率,嵌入sRGB色彩配置文件,并优化系统内存与硬盘性能以提升Krita处理效率。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在Krita中导出AI生成的8K艺术图片,核心…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的完整教程

    本教程详细介绍了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨如何利用 Laravel 内置的 $redirectTo 属性,以及如何通过重写 LoginController 中的 login 方法来实现自定义重定向逻辑。此外,教程还将重点讲解正确的路由配置和中间件使用…

    2026年9月21日
    000
  • safari浏览器怎么把标签页固定在最左边_safari浏览器标签页固定最左设置

    Safari可通过“固定标签”功能将常用网页保持在标签栏最左并随启动恢复;2. 手动拖动标签至最左可临时调整顺序但不永久保存;3. 结合书签栏添加常用网站并固定标签,可提升访问效率。 如果您希望在使用 Safari 浏览器时将常用网页始终保持在标签栏的最左侧位置,以便快速访问,可以通过以下方法实现标…

    2026年9月21日
    000
  • 如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    Animoto通过模板与拖放功能,结合AI生成的文案和配音,帮助用户快速制作品牌统一、节奏合理、带明确CTA的高效营销视频,适用于多平台推广。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Animoto是一个非常适合快速制作AI营销视频的…

    2026年9月21日 用户投稿
    000
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    000
  • 使用正则表达式检测字符串中的除零操作

    本文详细介绍了如何使用正则表达式精确检测字符串中潜在的除零操作。针对表达式中可能存在的变量引用(如<>)、数字、多余空格以及禁止包含引号等复杂情况,文章提供了一个高效的正则表达式模式,并深入解析其构成原理。通过具体的Java代码示例,读者将学习如何将此模式应用于实际编程场景,从而有效识别…

    2026年9月21日
    000
  • AI钉钉1.0联动雅里数科 共探“酒旅+AI”的工作新范式

    在数字化浪潮席卷全球的当下,人工智能正以前所未有的速度重塑各行各业,酒旅产业也正在迎来由ai驱动的深刻变革。10月11日,阿里巴巴钉钉再度走进雅里数科集团,开启一场关于“酒旅行业ai原生工作方式”的深度对话。此次交流标志着双方合作迈入全新阶段,致力于共同探索ai原生工作范式,引领酒旅行业迈向智能化发…

    2026年9月21日
    100
  • 解决WordPress wp-settings.php中致命错误的实用指南

    当WordPress网站遭遇wp-settings.php中Call to undefined function的致命错误时,通常意味着核心文件已损坏。本教程将指导您通过下载全新WordPress副本并替换站点中wp-admin和wp-includes目录来有效解决此问题,确保网站恢复正常运行,并提…

    2026年9月21日
    000
  • 构建Spring自定义Kafka配置的注解式解决方案

    本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

    2026年9月21日
    1100
  • 悟空浏览器开发者工具的控制台怎么用_悟空浏览器Console控制台使用入门教程

    首先启用悟空浏览器开发者工具并进入Console标签,可查看错误、警告等日志信息,通过过滤功能定位问题;支持执行JavaScript代码实时调试,监控网络请求失败及全局异常,还可清空或保存日志以便分析。 如果您在使用悟空浏览器进行网页开发或调试时,发现页面元素未按预期工作或脚本报错,则可以借助开发者…

    2026年9月21日
    700
  • 蝴蝶号无人直播中的AI角色控制技巧与注意事项

    蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项

    要让蝴蝶号ai角色在直播中更具真实感和互动性,关键在于注入“人味儿”,打破“机器感”。首先,声音要有温度,选择有情感起伏的音色,并根据不同语境调整语调、语速,适当加入语气词增强亲切感;其次,确保视觉形象与行为模式统一,动作、表情、眼神与语音内容自然同步,强化人设一致性;第三,建立多层次互动逻辑,ai…

    2026年9月21日 用户投稿
    400
  • 百度网盘官方网页登录 百度网盘网页版入口快捷

    百度网盘官方网页登录入口是https://pan.baidu.com,用户可直接访问该网址登录账号,主界面布局清晰,支持文件上传下载、智能检索、跨设备同步及在线预览等功能。 百度网盘官方网页登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来百度网盘网页版入口快捷方式,感兴趣的网友一起…

    2026年9月21日
    100
  • MAC系统磁盘空间不足怎么办_Mac磁盘空间清理与管理技巧

    Mac存储空间不足时,应先使用系统自带的存储管理工具分析并优化存储,通过“关于本机”进入“管理”界面,启用优化选项;接着手动删除不常用应用及其在Application Support和Caches中的残留文件;再进入资源库清理Caches和Logs中的缓存与日志;随后在“避免杂乱”中查找并删除大型无…

    2026年9月21日
    000
  • DALL-E的AI混合工具如何使用?生成创意图像的详细操作教程

    DALL-E的AI混合工具能将两张图片融合生成新图像,操作简单且支持权重调整与后期编辑,适用于创意激发与艺术探索。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ DALL-E的AI混合工具,简单来说,就是把两张图“缝合”在一起,让AI帮你生…

    2026年9月21日
    000
  • 实现搜索结果的 A-Z 排序:PHP 教程

    本文档旨在指导开发者如何在 PHP 中实现搜索结果的 A-Z 排序功能。通过结合 AJAX 技术和 PHP 函数,可以方便地对通过 POST 方法获取的医生搜索结果进行 A-Z 排序,从而优化用户浏览体验。本文将详细介绍实现步骤,提供可复用的代码示例,并着重强调注意事项,旨在帮助开发者快速掌握并应用…

    2026年9月21日
    000
  • MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    mysql原生全文搜索功能存在明显局限,需结合外部搜索引擎才能满足复杂需求。1. mysql全文搜索适用于小数据量、简单查询场景,但分词能力弱,尤其对中文支持差,查询功能有限,无法实现模糊查询、纠错等高级功能,且性能随数据量增长显著下降。2. 外部搜索引擎如elasticsearch(es)和sph…

    2026年9月21日 用户投稿
    000
  • Android应用中实现游戏循环与UI更新的正确姿势

    本文旨在解决Android应用开发中,开发者尝试使用传统游戏循环(如while(running))导致应用无响应或崩溃的问题。核心内容是阐明Android事件驱动的UI模型,指导开发者如何正确初始化UI组件、设置事件监听器,并通过事件回调机制实现逻辑更新和UI刷新,避免阻塞主线程,确保应用的流畅运行…

    2026年9月21日
    700
  • google浏览器“请停用以开发者模式运行的扩展程序”怎么解决_google浏览器开发者模式扩展提示解决方法

    1、关闭开发者模式并移除手动扩展可消除警告;2、替换为官方商店版本扩展避免风险;3、修改注册表或组策略可永久屏蔽提示;4、使用命令行参数临时绕过检查。 如果您在使用Google Chrome浏览器时,看到“请停用以开发者模式运行的扩展程序”的警告提示,这通常是因为当前有通过非应用商店方式加载的扩展程…

    2026年9月21日
    900

发表回复

登录后才能评论
关注微信