首页 > Java > java教程 > 正文

使用Java Stack和StringBuilder实现多句文本词语逆序

DDD
发布: 2025-10-30 15:06:13
原创
183人浏览过

使用Java Stack和StringBuilder实现多句文本词语逆序

本文详细介绍了如何利用java中的`stack`、`stringbuilder`和`stringjoiner`来对包含多个句子的文本进行词语逆序处理。文章从识别句末标点符号开始,逐步构建了一个高效的算法,通过将单词压入中,并在遇到句号时将栈内单词弹出并逆序重组成句子,最终实现了对每个句子独立进行词语逆序,并保留原始句子的结构。

在文本处理中,一个常见的需求是将句子中的词语进行逆序排列。当处理的文本包含多个句子时,挑战在于如何确保每个句子独立地进行词语逆序,而不是将整个文本视为一个整体进行逆序。本文将详细阐述如何利用Java的Stack、StringBuilder和StringJoiner等核心数据结构和工具,实现这一功能。

核心概念与数据结构

要实现多句文本的词语逆序,我们需要以下几个关键组件:

  1. java.util.Stack<String>:栈是一种后进先出(LIFO)的数据结构。它非常适合用于词语逆序,因为当我们按顺序将词语压入栈中,再按顺序弹出时,词语的顺序正好是反转的。
  2. java.lang.StringBuilder:StringBuilder是一个可变的字符序列,它比String在进行大量字符串拼接操作时效率更高。我们将使用它来累积最终逆序后的所有句子。
  3. java.util.StringJoiner:StringJoiner是Java 8引入的一个工具类,用于构造带分隔符的字符序列。它能够方便地将从栈中弹出的词语以空格分隔,重新组合成一个句子。

算法设计与实现

整个算法可以分为两个主要部分:主处理逻辑(reverseSentences方法)和辅助的句子构建逻辑(createSentence方法)。

1. 主处理逻辑:reverseSentences 方法

这个方法负责遍历输入的词语数组,识别句子的边界,并协调栈的操作以及最终结果的构建。

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

步骤:

微软文字转语音
微软文字转语音

微软文本转语音,支持选择多种语音风格,可调节语速。

微软文字转语音0
查看详情 微软文字转语音
  1. 初始化:创建一个Stack<String>用于临时存储每个句子的词语,以及一个StringBuilder用于累积所有逆序后的句子。
  2. 遍历词语:对输入的词语数组进行迭代。
  3. 判断句末:在每次迭代中,检查当前词语是否以句号(.)结尾。
    • 如果词语以句号结尾
      • 将该词语(去除句号)压入栈中。
      • 调用辅助方法createSentence将栈中的所有词语弹出并逆序重组成一个句子。
      • 将这个逆序后的句子追加到StringBuilder中。
      • 手动添加句号和空格,以保持原始文本的格式。
    • 如果词语不以句号结尾
      • 直接将词语压入栈中。
  4. 返回结果:遍历结束后,将StringBuilder转换为String并返回。
import java.util.Stack;
import java.util.StringJoiner;

public class SentenceReverser {

    public static String reverseSentences(String[] wordArray) {
        Stack<String> stack = new Stack<>();
        StringBuilder reversedSentences = new StringBuilder();

        for (String word : wordArray) {
            if (word.endsWith(".")) {
                // 如果是句子的最后一个词,去除句号后压栈
                stack.push(word.substring(0, word.length() - 1));

                // 逆序当前句子并追加到结果中
                reversedSentences
                    .append(createSentence(stack)) // 附加逆序后的句子
                    .append(". ");                 // 添加句号和空格

            } else {
                // 普通词语直接压栈
                stack.push(word);
            }
        }
        // 处理最后一个句子后可能剩余的词语(如果文本不以句号结尾)
        // 在本例中,假设所有句子都以句号结尾,否则需要额外处理stack中剩余的元素
        if (!stack.isEmpty()) {
            reversedSentences.append(createSentence(stack));
        }

        // 移除末尾可能多余的空格和句号,或者根据需求进行裁剪
        if (reversedSentences.length() > 0 && reversedSentences.toString().endsWith(". ")) {
            reversedSentences.setLength(reversedSentences.length() - 2); // 移除最后的". "
        }
        return reversedSentences.toString();
    }

    // ... createSentence 方法将在下面介绍
}
登录后复制

2. 辅助方法:createSentence 方法

这个方法负责从栈中弹出词语,并使用StringJoiner将它们以正确的逆序组合成一个完整的句子。

步骤:

  1. 初始化StringJoiner:创建一个StringJoiner实例,并指定词语之间的分隔符(例如,一个空格)。
  2. 弹出词语:在一个while循环中,只要栈不为空,就不断从栈中弹出词语。
  3. 添加词语:将弹出的每个词语添加到StringJoiner中。由于栈的LIFO特性,弹出的词语顺序将是逆序的。
  4. 返回句子:循环结束后,将StringJoiner转换为String并返回,即为逆序后的句子。
// 承接上面的 SentenceReverser 类
public class SentenceReverser {
    // ... reverseSentences 方法

    public static String createSentence(Stack<String> stack) {
        StringJoiner sentence = new StringJoiner(" "); // 使用空格作为词语分隔符
        while (!stack.isEmpty()) {
            sentence.add(stack.pop()); // 从栈中弹出词语并添加到StringJoiner
        }
        return sentence.toString();
    }

    public static void main(String[] args) {
        String text = "Cats are cool. Dogs are cool. So are turtles.";
        // 使用空格作为分隔符将文本拆分成词语数组
        String[] words = text.split(" "); 
        System.out.println("原始文本: " + text);
        System.out.println("逆序后文本: " + reverseSentences(words));
    }
}
登录后复制

完整代码示例

import java.util.Stack;
import java.util.StringJoiner;

public class SentenceReverser {

    /**
     * 对包含多个句子的文本进行词语逆序处理。
     * 每个句子独立逆序,并保留句子的原始结构。
     *
     * @param wordArray 包含所有词语的字符串数组,词语之间以空格分隔。
     * @return 逆序处理后的完整文本。
     */
    public static String reverseSentences(String[] wordArray) {
        Stack<String> stack = new Stack<>();
        StringBuilder reversedSentences = new StringBuilder();

        for (String word : wordArray) {
            // 检查当前词语是否以句号结尾,作为句子结束的标志
            if (word.endsWith(".")) {
                // 将句号前的部分压入栈中
                stack.push(word.substring(0, word.length() - 1));

                // 当遇到句号时,表示一个句子结束,从栈中弹出词语并重构逆序句子
                reversedSentences
                    .append(createSentence(stack)) // 附加逆序后的句子
                    .append(". ");                 // 添加句号和空格以分隔句子

            } else {
                // 普通词语直接压入栈中
                stack.push(word);
            }
        }

        // 考虑如果最后一个句子不以句号结尾,栈中可能还有剩余词语
        // 本例假设所有句子都以句号结尾,若有其他情况,需在此处补充处理逻辑
        if (!stack.isEmpty()) {
            // 如果在循环结束后栈中仍有词语,说明最后一个句子没有以句号结束
            // 或者文本的末尾是未处理的词语。将其作为最后一个句子处理。
            reversedSentences.append(createSentence(stack));
        }

        // 移除末尾可能多余的空格和句号,使输出更整洁
        // 例如,如果原始文本是 "A. B.",处理后可能是 "A. B. ",需要移除末尾的". "
        if (reversedSentences.length() > 0 && reversedSentences.toString().endsWith(". ")) {
            reversedSentences.setLength(reversedSentences.length() - 2); // 移除最后的". "
        }

        return reversedSentences.toString();
    }

    /**
     * 从栈中弹出所有词语,并使用空格将它们连接成一个逆序的句子。
     *
     * @param stack 包含一个句子所有词语的栈。
     * @return 逆序后的句子字符串。
     */
    public static String createSentence(Stack<String> stack) {
        StringJoiner sentence = new StringJoiner(" "); // 使用空格作为词语之间的分隔符
        while (!stack.isEmpty()) {
            sentence.add(stack.pop()); // 从栈顶弹出词语并添加到StringJoiner中
        }
        return sentence.toString();
    }

    public static void main(String[] args) {
        String text = "Cats are cool. Dogs are cool. So are turtles.";
        // 将文本按空格拆分为词语数组。注意,句号会与最后一个词语连在一起。
        String[] words = text.split(" "); 

        System.out.println("原始文本: " + text);
        System.out.println("逆序后文本: " + reverseSentences(words));
        // 预期输出: cool are Cats. cool are Dogs. turtles are So.
    }
}
登录后复制

运行结果

原始文本: Cats are cool. Dogs are cool. So are turtles.
逆序后文本: cool are Cats. cool are Dogs. turtles are So.
登录后复制

注意事项与扩展

  1. 标点符号处理:当前实现只针对句号(.)作为句子结束标志。如果需要处理问号(?)、感叹号(!)或其他标点符号,需要修改word.endsWith(".")的判断逻辑,可能需要使用正则表达式来更灵活地识别句子边界。
  2. 分词策略:本示例使用text.split(" ")简单地将文本按空格分割成词语。对于更复杂的文本(例如,包含逗号、分号等,或需要处理多语言),可能需要更高级的分词器(Tokenize)来准确地提取词语。
  3. 空字符串和多个空格:split(" ")在遇到多个连续空格时可能会产生空字符串。虽然本例中的输入没有这个问题,但在实际应用中需要考虑过滤掉空字符串。
  4. 性能:对于非常大的文本,StringBuilder在字符串拼接方面提供了良好的性能。Stack的操作(push和pop)通常是O(1)时间复杂度,效率也很高。
  5. 代码健壮性:在实际项目中,可以增加对输入wordArray是否为null或空数组的检查,以提高代码的健壮性。

总结

通过结合Stack的LIFO特性、StringBuilder的高效拼接以及StringJoiner的便捷连接,我们可以有效地实现对多句文本中每个句子词语的独立逆序。这种方法结构清晰、逻辑严谨,为处理类似文本操作提供了可行的解决方案。理解并掌握这些Java核心工具的使用,对于编写高效且易于维护的文本处理程序至关重要。

以上就是使用Java Stack和StringBuilder实现多句文本词语逆序的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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