2014-01-19 103 views
0

我想編寫一個字符串反轉的代碼。兩個變量初始化立即在for循環

我知道有很多方法。不過,我想嘗試使用陣列。但是我的輸出有問題。

以下是我的代碼:

package practice_package; 

public class Practice_Class { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    String s1 = "Jeevan"; 
    char[] a = s1.toCharArray(); 
    String s2 = "satyasahithi"; 
    char[] b = s2.toCharArray(); 
    String rs1 = new String(reverse(a)); 
    System.out.println("The reverse of '" + s1 + "' is: '" + rs1 + "'"); 
    String rs2 = new String(reverse(b)); 
    System.out.println("The reverse of '" + s2 + "' is: '" + rs2 + "'"); 

} 
public static char[] reverse(char[] args) { 
    char[] r = args; 
    int i,j; 
    for(i=args.length-1,j=0; i>=0 && j<args.length; i--, j++) { 
     r[j]= args[i]; 
    } 
    System.out.println(r); 
    return r; 
} 
} 

而且我的輸出是:

navvan 
The reverse of 'Jeevan' is: 'navvan' 
ihtihaahithi 
The reverse of 'satyasahithi' is: 'ihtihaahithi' 

正如你所看到的,只有字符串的前半部分被而下半場仍然是它扭轉是。 代碼中有什麼問題。我可以在'for'循環中同時初始化兩個變量嗎?我在哪裏錯過了邏輯?

+2

您需要創建一個單獨的'char'數組來存儲結果。現在你的算法正在讀取和寫入同一個數組。你的第一個賦值'char [] r'不會創建'args'的副本。它實際上是對同一個數組對象的另一個引用。 – tiguchi

+0

@NobuGames呀!得到它了。謝謝! :)現在我記得當我們將一個變量等於另一個變量時,只會引用值而不是創建新的內存。 –

回答

1

當您將最後一個分配給第一個時,您將丟失字符,您應該將其保留在臨時值中並分配給其他值。

for(i=args.length-1,j=0; i>=0 && j<args.length/2; i--, j++) { 
    char t = r[j]; 
    r[j]= r[i]; 
    r[i] = t; 
} 
+0

非常感謝! :)但仍然沒有得到你所做的邏輯......將試圖理解!非常棘手! :P –

0

使用StringBuffer.reverse()

String s1 = "Jeevan"; 
StringBuffer a = new StringBuffer(s1); 
System.out.println(a.reverse()); 
0

的你for循環內的邏輯。讓我們考慮第一個迭代,其中i指向5(在字符串Jeevan的情況下)並且j指向0.當你說r[j]= args[i] J將被n替代,並且你失去了字符J.這是邏輯出錯的部分。作爲一種解決方案,您可以採取另一種陣列和存儲如下給出

public static char[] reverse(char[] args) { 
char[] r = new char[args.length]; 
int i,j; 
for(i=args.length-1,j=0; i>=0 && j<args.length; i--, j++) { 
    r[j]= args[i]; 
} 
System.out.println(r); 
return r; 
} 

或如上面建議的nr4bt。