【Java】转置String的各种方法分析
字符串倒置
說到這字符串倒置,其實還有些值得說道的,盡管不難。
C/C++有個reverse(),可以直接用,但我大Java并沒有……
想到一種辦法并不難,但你能想到幾種有效的辦法呢?
一起來看看吧!
先做一下基本的定義,后面可以統一使用:
String string = "ADFGJINJOOKC"; int length = string.length(); char[] chars0 = string.toCharArray();Strategy_1:倒轉char[]
倒轉char[]其實就是新生成一個char[],正向遍歷原char[],把char數據逆向復制到新char[]中。
char[] chars1 = new char[length]; for (int i = 0; i < length; i++) {chars1[i] = chars0[length-i-1]; } System.out.println(new String(chars1));Strategy_2:利用StringBuilder的reverse()
雖然String沒有reverse(),但可以利用String對象生成StringBuilder對象,再reverse(),打印就直接調toString()了,方便簡潔。
System.out.println(new StringBuilder(string).reverse());Strategy_3:直接拼接
所謂直接拼接,其實就是new一個StringBuilder對象,倒著遍歷char[],把char一個一個append()到StringBuilder對象上。
StringBuilder reverse3 = new StringBuilder(); for (int i = length-1; i >= 0; i--) {reverse3.append(chars0[i]); } System.out.println(reverse3);看了解法二,說實話,此法大可不必……
Strategy_4:直接倒著打印
倒著遍歷,直接打印。
由于需要大量的IO,所以慢。
也就初學者會真的這么用吧……
Strategy_5:利用charAt(i)來拼接
String確實有charAt(i),但為什么擺著現成的隨機訪問index不用呢?何必何必,感覺還不如方法三。
StringBuilder reverse5 = new StringBuilder(); for (int i = length-1; i >= 0; i--) {reverse5.append(string.charAt(i)); } System.out.println(reverse5);Strategy_6:使用棧來拼接
棧自然是可以的,LIFO,但單獨拿出來而不利用數組的隨機訪問,大可不必。
何況是Java的java.util.Stack,繼承自java.util.Vecter的一個類,一個被synchronized包裹的類,不必……
Stack<Character> stack = new Stack<>(); for (char c : chars0) {stack.push(c); } StringBuilder reverse6 = new StringBuilder(); while (!stack.isEmpty()) {reverse6.append(stack.pop()); } System.out.println(reverse6);Strategy_7:兩側向中間交換
這個思想就是swap(),經典的交換算法。
char[] chars7 = chars0; for (int i = 0; i < length/2; i++) {char temp = chars7[i];chars7[i] = chars7[length-i-1];chars7[length-i-1] = temp; } System.out.println(new String(chars7));Strategy_7の位運算優化
先寫swap():
private static void swap(char a, char b) {if (a != b) {a ^= b;b ^= a;a ^= b;} }再寫具體的交換:(畢竟引用傳遞嘛,隱去了指針,不需使用&)
char[] chars8 = chars0; for (int i = 0; i < length/2; i++) {swap(chars8[i], chars8[length-i-1]); } System.out.println(new String(chars8));完整Java代碼
import java.util.Stack;public class StringReverseTest {private static void swap(char a, char b) {if (a != b) {a ^= b;b ^= a;a ^= b;}}public static void main(String[] args) {String string = "ADFGJINJOOKC";int length = string.length();char[] chars0 = string.toCharArray();//方法一:倒轉char[]char[] chars1 = new char[length];for (int i = 0; i < length; i++) {chars1[i] = chars0[length-i-1];}System.out.println(new String(chars1));//方法二:利用StringBuilder的reverse()System.out.println(new StringBuilder(string).reverse());//方法三:直接拼接StringBuilder reverse3 = new StringBuilder();for (int i = length-1; i >= 0; i--) {reverse3.append(chars0[i]);}System.out.println(reverse3);//方法四:直接倒著打印for (int i = length-1; i >= 0; i--) {System.out.print(chars0[i]);}System.out.println();//方法五:利用charAt(i)來拼接StringBuilder reverse5 = new StringBuilder();for (int i = length-1; i >= 0; i--) {reverse5.append(string.charAt(i));}System.out.println(reverse5);//方法六:使用棧來拼接Stack<Character> stack = new Stack<>();for (char c : chars0) {stack.push(c);}StringBuilder reverse6 = new StringBuilder();while (!stack.isEmpty()) {reverse6.append(stack.pop());}System.out.println(reverse6);//方法七:兩側向中間交換char[] chars7 = chars0;for (int i = 0; i < length/2; i++) {char temp = chars7[i];chars7[i] = chars7[length-i-1];chars7[length-i-1] = temp;}System.out.println(new String(chars7));//swap()char[] chars8 = chars0;for (int i = 0; i < length/2; i++) {swap(chars8[i], chars8[length-i-1]);}System.out.println(new String(chars8));}}表表態
個人用著方法二,那個StringBuilder的reverse()比較順手。
總結
以上是生活随笔為你收集整理的【Java】转置String的各种方法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】基本语法训练题
- 下一篇: 【数字逻辑设计】关于Logisim的使用