(一)题目
题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
接口说明
/**
* 反转句子
*
* @param sentence 原句子
* @return 反转后的句子
*/
public String reverse(String sentence);
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
示例1
输入
扫描二维码关注公众号,回复:
2299267 查看本文章
I am a boy
输出
boy a am I
(二)解答过程
(1)在做题的过程中发现了一个奇怪的问题,就是讲句子存到数组中后,不论是从index=0打印到
结尾,还是从index=buf.length-1遍历到index=0,输出结果竟然一样
package cn.niu.xiti;
import java.util.*;
public class Test2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String str = sc.next();
String[] buf = str.split("\\ ");
Stack<String> stack = new Stack<>();
for(int i=0;i<buf.length;i++){
//for(int i=buf.length-1;i>=0;i--){
stack.push(buf[i]);
System.out.print(buf[i]+" ");
}
/**
while(!stack.isEmpty()){
for(int j=0;j<buf.length-1;j++){
// System.out.print(stack.pop());
// System.out.print("==");
}
//System.out.print(stack.pop());
}*/
}
}
}
console:life is wonderful
life is wonderful (结果和输入一样)
从数组后往前遍历
//for(int i=0;i<buf.length;i++){
for(int i=buf.length-1;i>=0;i--){
stack.push(buf[i]);
System.out.print(buf[i]+" ");
}
console:life is wonderful
life is wonderful(从后往前遍历,也和输入一样!!!!!什么情况,还有这种操作?)
(2) public static void main(String[] args){
String str = "life is wonderful";
String[] buf = str.split("\\ ");
//for(int i=0;i<buf.length;i++){
for(int i=buf.length-1;i>=0;i--){
System.out.print(buf[i]+" ");
}
}
console:wonderful is life (与输入反序了,说明是Scanner输入有问题)
(3)经过一番实验,发现是与Scanner输入有关的地方存在问题
(a)next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,
next()方法会自动将其去掉,只有在输入有效字符之后,
next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
简单地说,next()查找并返回来自此扫描器的下一个完整标记。
完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串。
(b)而nextLine()方法的结束符只是Enter键,
即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
通俗点来说:Scanner类的next()方法只能获得此题某个句子的第一个单词(第一个单词后存在空格,结束后续扫描),而nextLine()方法可以获取到整句话,直至遇到enter键。
(c)由此也可以解释为什么上述从头到尾遍历数组和从尾到头遍历数组结果都和输入一样
原因:这种做法有问题,Scanner默认使用空格作为分割符来分隔文本
所以后续进行字符串拆分并将单词放入数组中时,数组中每次都只有一个单词
因此不论是正序遍历输出还是反序遍历输出结果都一致。
(4)做个测试,查看一下next()方法和nextLine()方法的区别
package cn.niu.xiti;
import java.util.*;
public class Test3{
public static void main(String[] args) {
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.next();
//sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+"=="+s2);
}
}
console:请输入第一个字符串:here we go now
请输入第二个字符串:输入的字符串是:here== we go now
从控制台输出的结果来看,是符合上述结论的,next()方法遇到空格就停止了,只读了一个here,
而nextLine()方法一直读到遇到enter键为止
而且此时没法从键盘给s2输入值,为什么?思考一下
(5).转换一下(4)中next()和nextLine()方法的位置测试一下
package cn.niu.xiti;
import java.util.*;
public class Test3{
public static void main(String[] args) {
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.nextLine();
//sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.next();
System.out.println("输入的字符串是:"+s1+"=="+s2);
}
}
console:请输入第一个字符串:here we go alright
请输入第二个字符串:a nice day
输入的字符串是:here we go alright==a
与预期相同
(6).对于(4)中s2无法从键盘输入值的问题,解决方法是在其后面增加一句sc.nextLine(),这样
S2就可以从键盘获取值了
package cn.niu.xiti;
import java.util.*;
public class Test3{
public static void main(String[] args) {
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.next();
sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+"=="+s2);
}
}
console:请输入第一个字符串:stay at home
请输入第二个字符串:go shopping (从键盘输入的值)
输入的字符串是:stay==go shopping
(三)Scanner类真的是非常强大,有空需要经常回头思考,思考一下以上现象发生的原因。