2014-09-23 183 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