2014-09-23 236 views
0

所以我在計算機科學課上遇到了一些麻煩。我需要編寫一些代碼,這些代碼需要一個字符串並以反向字符順序向後打印。他告訴我找到一個空白空間,然後從那裏打印,然後繼續搜索....並重復此操作直到字符串結束。我輸入了我的代碼,並將它打印出第一個單詞三次。我知道這對你們來說可能很明顯。向後打印字符串

public class Backwords 

/* 
* Gets words from main and prints in reverse order 
*/ 
public static String BackwardsString(String str) 
{ 

    String str1 = (" " + str); 
    String answer = (" "); 
    int lastpos = str1.length(); 
    for(int currpos = str.length(); currpos >= 0; currpos--) //shazam 
    { 
     if (str1.charAt(currpos) == ' ') 
     { 
      for (int p = currpos+1; p <lastpos; p++) //majicks 

      answer = answer + str1.charAt(p); 
      lastpos = currpos; 
      System.out.println(answer); 
     } 

    } 
    return answer; 
} 
public static void main(String [] args) 
{ 
    System.out.println("Enter a string : "); 
    Scanner firststr = new Scanner(System.in); //gets string input 
    String str = firststr.next(); 
    System.out.println(BackwardsString(str)); 

} 

}

+0

你的意思是這樣嗎? http://stackoverflow.com/questions/9105277/reverse-string-word-by-word-in-java – Rockstar 2014-09-23 12:02:09

+0

我試着你的代碼與字符串「第一第二第三第四」,並得到了輸出「第四第三secondfirst」。唯一的問題是你沒有在反轉的單詞之間添加空格。也就是說,有很多方法可以改善您的代碼,正如其他答案中所建議的那樣。 – Eran 2014-09-23 12:12:07

+0

你怎麼會認爲我得到「輸入的字符串: 第一第二第三第四 第一 第一」 – 2014-09-23 12:37:40

回答

0

您應該使用的StringBuilder代替String在這裏,因爲可以有很多String級聯可在堆創造更多的對象。

使用StringBuilder你也可以做到這一點。

如:

public static String BackwardsString(String str) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(str); 
    return stringBuilder.reverse().toString(); 
} 

public static void main(String[] args) { 
    System.out.println("Enter a string : "); 
    Scanner firststr = new Scanner(System.in); 
    String str = firststr.next(); 
    System.out.println(BackwardsString(str)); 
} 
+0

或者你也可以使用StringBuffer,它提供了相同的功能:StringBuffer.reverse()http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html#reverse%28%29 – 2014-09-23 12:01:55

+1

@MartinFrank從不在'StringBuiler'上使用'StringBuffer'。 'StringBuffer'是線程安全的並且相當慢。 – 2014-09-23 12:03:22

+0

感謝您在'StringBuffer'上提供這個附加提示... – 2014-09-23 12:16:16

1

設置接聽回answer = ""之前第二嵌套for循環

for(int currpos = str.length(); currpos >= 0; currpos--) //shazam 
    { 
     if (str1.charAt(currpos) == ' ') 
     { 
      answer = ""; 
      for (int p = currpos+1; p <lastpos; p++) //majicks 

       answer = answer + str1.charAt(p); 
      lastpos = currpos; 
      System.out.println(answer); 
     } 

    } 
+0

仍然重複第一個單詞@hyades – 2014-09-23 12:38:36

+0

這是因爲您正在打印返回值,這是答案的最後一個值。因此兩次。 – hyades 2014-09-23 13:18:55

+0

輸入:hello world輸出:你好 – 2014-09-23 13:48:16

0

試試這個

Scanner sc = new Scanner(System.in); 
System.out.println("Enter the string "); 
String str = sc.nextLine(); 
String[] strArray = str.split(" "); 
StringBuilder reverseString = new StringBuilder(""); 
for (int i = strArray.length - 1; i >= 0; i--) { 
     reverseString.append(strArray[i]+" "); 
} 
System.out.println("Reverse of string is : "+reverseString.toString()); 
0

你可能有一個更容易的時間分割字符串:

String[] words = str1.split(" "); 

然後,你可以對每個單詞[i]進行反轉,你可以將它分解爲一個char數組,或者像其他人所建議的那樣使用一個stringbuilder,就你認爲適合你的類而言。

+0

我們只能使用他教給我們的東西。重點是使用for循環。我可能會這樣做,雖然正確嗎? – 2014-09-23 12:39:20