?????? 前几天看见一篇文章,说使用Java能用几种方式反转一个字符串。首先要明白什么叫反转字符串,就是将一个字符串到过来啦,比如"倒过来念的是小狗"反转过来就是”狗小是的念来过倒“。接下来就把自己能想到的所有方式记录下来了。
1、第一个念头就是直接使用String类的反转方法,对不起,这样是不行的,因为String类没有这个方法。那么好吧,搞个数组,然后遍历数组,依次调换数组中对应的各个字符。
// 直接使用数组首位调换
public String reverse1(String str) {
if (str == null || str.length() <= 1) {
return str;
}
char[] array = str.toCharArray();
char[] reverseArray = new char[array.length];
for (int i = 0; i < array.length; i++) {
reverseArray[array.length - 1 - i] = array[i];
}
return new String(reverseArray);
}
2、除了上面使用的方法,其实我们还可以使用递归迭代的方法,因为如果只有一个字符的时候,反转一个字符就是它本身。
// 巧妙使用递归的方式
public String reverse2(String str) {
if (str == null || str.length() <= 1) {
return str;
}
return reverse2(str.substring(1)) + str.charAt(0);
}
3、String类没有反转字符串这个方法,但是StringBuffer有这个方法,所以可以先将String转换成StringBuffer,然后利用StringBuffer反转,然后再将反转以后StringBuffer转换成String。这一招可能是最方便的。
public String reverse3(String str) {
if (str == null || str.length() <= 1) {
return str;
}
StringBuffer sb = new StringBuffer(str);
sb = sb.reverse();
return sb.toString();
}
4、除了使用StringBuffer直接的反转方法,我们还可以借助StringBuffer的其他方法完成。
?
//这是使用StringBuffer的setCharAt()方法
? ? ? ? public String reverse4(String str) {
if (str == null || str.length() <= 1) {
return str;
}
StringBuffer sb = new StringBuffer(str);
for (int i = 0; i < (str.length() / 2); i++) {
int swapIndex = str.length() - 1 - i;
char swap = sb.charAt(swapIndex);
sb.setCharAt(swapIndex, sb.charAt(i));
sb.setCharAt(i, swap);
}
return sb.toString();
}
?
//这是使用StringBuffer的append()方法,倒序将原来String的字符插入
public String reverse4(String str) {
if (str == null || str.length() <= 1) {
return str;
}
StringBuffer sb = new StringBuffer(str.length());
for (int i = str.length() - 1; i >= 0; i--) {
sb.append(str.charAt(i));
}
return sb.toString();
}
?
5、再仔细想想,反转字符串的过程,就是一次将字符放入一个队列,然后再倒序的依次拿出来,这个恰好和Java的堆栈Stack很像,先进后出。
public String reverse5(String str) {
if (str == null || str.length() <= 1) {
return str;
}
String result = "";
char[] arr = str.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (char a : arr) {
stack.push(a);
}
int length = stack.size();
?//注意这个地方,需要先将stack的length记录下来,因为在遍历的过程中,使用stack的pop方法,会改变stack的大小。
for (int i = 0; i < length; i++) {
result += stack.pop();
}
return result;
}
?????? 条条大路通罗马,只要肯思考,肯尝试,我们最终总能找到一中或者多种方式达到我们的目的。希望以后自己在编程的道路上,能够发散思维,寻找到解决各种问题的方法。