前几天看见一篇文章,说使用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; } |
条条大路通罗马,只要肯思考,肯尝试,我们最终总能找到一中或者多种方式达到我们的目的。希望以后自己在编程的道路上,能够发散思维,寻找到解决各种问题的方法。
原文地址:http://jlins.blog.51cto.com/4487484/1584800