编写一个方法,将一段文本中的各个单词的字母顺序翻转题
1.任务介绍
编写一个方法,将一段文本中的各个单词的字母顺序翻转, 例如:“I like writing code best”,将变成"I ekil gnitirw edoc tseb"。
2.思路
① 通过空格将字符串进行切割,保存为字符串类型的数组。
注意:第一个字符或者最后一个字符为空时,造成切割份数不符合规律,这里再遍历时跳过这两个字符,不影响储存字符串;
② 将存储分割后字符串数组,通过遍历,将每段字符串进行翻转,存入新的字符串数组;
注意:这里可以使用StringBuilder或者StringBuffer的append方法对反转后的字符串进行拼接,而初学的我使用了浪费内存的直接字符串拼接,这样会造成字符串常量池大量字符串占用内存无法回收,不推荐使用;
3.用到的类及方法
(1)String类
①用到的构造方法
·String()// 返回String类型,初始化为空字符序列;
·String(char[] value)// 返回String类型,包含字符数组中的参数序列;
②用到的方法
(1)indexOf(int ch,fromIndex);indexOf(String str, int fromIndex)
返回类型:int
说明:从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引;
注意:形参int ch表示要查找字符对应的ASCII码值,例如要查找空格第一次常出现的位置:int index = str.indexOf(32);fromIndex为可选参数,指查找的开始下标;
(2)substring(int beginIndex, int endIndex)
返回类型:String;
说明:两个下标之间截取的字符串;
注意:返回的字符串包含beginIndex对应的字符,不包含endIndex,我因为这个找了挺久bug,这种左闭右开的逻辑有丝熟悉的味道;
(3)getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
这个本来是用不到的,但是作为初学,为及时了解到substring方法,在这个任务中,我用了这个方法作为替代,用起来比较麻烦;
返回类型:void
说明:将一段字符序列存储到字符类型的数组中
(2) StringBuilder类
① 用到的构造方法
StringBuilder()//构造一个字符串构建器,其中不包含任何字符,初始容量为16个字符。
StringBuilder(String str)//构造一个初始化为指定字符串内容的字符串构建器。
② 用到的方法
(1)append(String str);
这个任务里我是用的是直接加字符串,但是推荐使用append
返回类型:StringBuilder;
说明:将字符串str拼接到目标对象的字符串中
(2)reverse()
返回类型:StringBuilder
说明:使此字符串序列翻转
4.代码如下
import java.util.Scanner;
public class StringTaskOne {
// 任务1:个单词字母顺序反转
public static void main(String[] args) {
// 创建界面和数据处理对象
UserInput user = new UserInput();
ValueDeal deal = new ValueDeal();
// 欢迎界面
user.welcome();
// 用户输入
String value = user.inputValue();
// 获取空格数量
int count = deal.spaceCount(value);
// 存储拆分后的单词
String[] valueSplit = deal.splitStr(count,value);
// 获取处理后的反转语句
String valueReverse = deal.reverseValue(valueSplit);
// 输出反转后的语句
user.outValue(valueReverse);
// 结束程序
user.end();
}
}
// 界面类,为了方便观看,而且代码量较少,这里不再建class文件
class UserInput{
// 属性,用户输入
private Scanner input = new Scanner(System.in);
// 构造方法一:无参构造法
UserInput(){};
// 方法一:欢迎界面
public void welcome(){
System.out.println("=====程序已启动,感谢您的使用=====");
}
// 方法一:返回用户输入值
public String inputValue(){
// 提示用户输入
System.out.println("请输入要反转的语句");
// 返回用户输入语句
return input.nextLine();
}
// 方法二:显示处理后的语句
public void outValue(String str){
// 输出接收到的字符串
System.out.println("反转后的语句为:"+str);
}
// 方法三:结束提示
public void end(){
System.out.println("本次服务到此结束-_-");
}
}
// 数据处理类
class ValueDeal{
// 属性
//构造方法一:空构造方法
ValueDeal(){};
// 方法一:获取输入的语句空格数量
public int spaceCount(String str){
// 存储已找到空格数量
int number = 0;
// 通过indexOf查找空格,为了防止首字符和尾字符是空格,从1小标开找,最大下标减一结束
for(int i = 1;i < str.length()-1;i++){
// 空格的ASCII码为32
i =str.indexOf(32,i);
if(i == -1){
// 等于-1,说明已经不存在空格,返回即可
return number;
}else{
// 找到后空格数量记加一
number++;
}
}
// 下面语句不需要,但是不加语法通不过
return number;
}
// 方法二,根据空格数量,将字符串拆分成单词
public String[] splitStr(int count,String string){
// 存储上一空格下标位置,第一个空格(假设)相当于在第一个元素之前
int a1 = -1;
// 存储拆分出的字符
char[] ch;
// 存储拆分后的语句,count个空格将语句分为空格+1份
String[] str = new String[count+1];
for(int i = 1;i<string.length()-1;i++){
// 定义字符长度
i = string.indexOf(32,i);
// 如果i为-1,跳出
if(i == -1){
break;
}
ch = new char[i - a1 - 1];
// 赋值
string.getChars(a1+1,i,ch,0);
//存储至数组
str[str.length-count-1] = new String(ch);
// 空格数减一
count--;
a1 = i;
}
// 将尾部字符串存入
ch = new char[string.length()-1 - a1];
string.getChars(a1+1,string.length(),ch,0);
str[str.length-1] = new String(ch);
// 返回处理后的数组
return str;
}
// 方法三:将处理后的数组转换为反转语句
public String reverseValue(String[] str){
// 存储字符串的变量
String string = ""+new StringBuilder(str[0]).reverse();
// 通过遍历将语句拼接
for(int i = 1;i < str.length;i++){
string = string + " "+new StringBuilder(str[i]).reverse();
}
return string;
}
}
5.运行效果如下:
初次写博客,请多多指教