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);
}
}