设计和实现一个应用程序,读取用户输入的一个句子,并且反向显示每个词的字符:

 

package javaFirst;

import java.util.Scanner;

import java.util.Stack;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class CollectionTest {

     /*

      * 设计和实现一个程序,读取用户输入的一个句子,并反向显示每个词的字符。 使用栈来颠倒每个词的字符

      */

     // 声明一个栈引用,用来反转单词

     private Stack<String> stack;

     // 初始字符串

     private String initalStr = null;

     // 最终字符串

     private String finalStr = null;

     // 中间字符串

     StringBuffer sb = new StringBuffer();

     // 一个游标,指示目前反转进行的位置

     private static int cursor = 0;

     // 接受正则表达式匹配的当前group的String变量(这个程序里group为匹配到的非单词字符)

     private String gro = null;

     // 构造方法,新建一个栈

     public CollectionTest() {

          stack = new Stack<String>();

     }

     /*

      * 识别语句中的单词,将单词中的每个字符入栈; 碰到空格或标点符号,则将这个标识符前面的单词语序反转(出栈)

      * 英文中的标点符号是有: :、,!

      *

      * @参数:根据输入的一个语句得到的字符串

      *

      * @返回值:将句子中的每个单词进行反转,之后得到的字符串

      */

     private String reverseWord(String str) {

          // 依据正则表达式创建匹配器:匹配非单词字符

            //并且不匹配汉字

          Pattern p = Pattern.compile("[\\W&&[^\\u4e00-\\u9fa5]]+");

          Matcher m = p.matcher(str);

          // 第一次匹配,以后的的每次匹配在下面循环语句里进行

          m.find();

          gro = m.group();

          // 实现算法主体

          for (cursor = 0; cursor < str.length(); cursor++) {

              // 如果游标到达当前被匹配子字符串的左边界,将前面入栈的元素出栈,得到一部分反向字符串

              if (cursor == m.start()) {

                   int n = stack.size();

                   for (int i = 1; i <= n; i++) {

                        sb.append(stack.pop());

                   }

                   continue;

              }

              // 如果游标在当前被匹配的子字符串的中间,游标自动前进,不执行操作

              else if (cursor > m.start() && cursor < m.end()) {

                   continue;

              }

              // 游标到达当前被匹配的子字符串的右边界,将刚刚游标便利过的被匹配的子字符串拼接到sb(保持输入顺序,它是标点符号),

              // 因为计算右边界的函数end()=真实右边界+1;所以还要将当前位置的单词字符入栈,

              //匹配下一个子字符串,并且取得下一个匹配到的子字符串

              else if (cursor == m.end()) {

                   sb.append(gro);

                   stack.push(String.valueOf(str.charAt(cursor)));

                   m.find();

                   gro = m.group();

                   continue;

              }

              // 将单词字符入栈

              else {

                   stack.push(String.valueOf(str.charAt(cursor)));

              }

          }

          // 实现句子末尾的标点符号的拼接

          sb.append(m.group());

          // 返回拼接好的字符串

          return sb.toString();

     }

     // 主函数

     @SuppressWarnings("resource")

     public static void main(String[] args) {

          CollectionTest coll = new CollectionTest();

          Scanner sc = new Scanner(System.in);

          // 从System.in接受初始字符串

          coll.initalStr = sc.nextLine();

          System.out.println("初始语句为:" + coll.initalStr);

          // 执行反转单词操作

          coll.finalStr = coll.reverseWord(coll.initalStr);

          // 输出反转结果

          System.out.println("反转后语句为:" + coll.finalStr);

     }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值