2016-11-11 3 views
-2

Я пишу код, чтобы отменить подстроки в строке. Например: Привет мир результат: olleH dlrowjava.lang.StringIndexOutOfBoundsException reverse

public class q05 { 
public static void main(String[] args) { 

    System.out.println("Please enter a string: "); 
    Scanner sc=new Scanner(System.in); 
    String str= sc.nextLine(); 
    int length = 0,beginString=0,j=0,i=0; 
    String reversedString=new String(); 

    while(length<str.length()){ //check all the string 

     for(i=0;str.charAt(i)!= ' ';i++){ 
     j++; 
     } 
     String subString= str.substring(beginString, j); // create substring 
     String reversedsubString=new String(); // create the blank substring 
     System.out.println(subString); 

     while(j>=0){ // reverse the substring 

      reversedsubString=reversedsubString+subString.charAt(j); 
      j--; 


     } 


     reversedString=reversedString+reversedsubString; 
     System.out.println(reversedString); 
     i++; 
     length++; 
     } 

    System.out.println(reversedString); 

} 

Это дает мне ошибка: java.lang.StringIndexOutOfBoundsException

Где ошибка?

+1

Примечание для вашего будущего: когда вы получаете исключение и спрашиваете об этом, вы также должны отправить трассировку. – Thomas

+2

Одно быстрое наблюдение: 'for (i = 0; str.charAt (i)! = ''; I ++)' - когда вы думаете, что цикл остановится для строк, которые не содержат пробелов? Подсказка: в 'i == str.length()'. А теперь угадайте, как это остановится ... вы правы, с 'StringIndexOutOfBoundsException'. – Thomas

+1

Другое примечание: конкатенация строк может использовать довольно много памяти, так как система создаст новую строку для каждого 'a + b'. Лучше использовать 'StringBuilder' вместе с его' append() 'методами. Btw, 'StringBuilder' также имеет метод' reverse() ', поэтому разделение вашего ввода и изменение отдельных частей может сделать трюк :) – Thomas

ответ

1

Как вы не указали ограничения эффективности, это должно работать:

public static void main(String[] args) { 


    String input = "Hello world"; 


    StringBuilder sb = new StringBuilder(); 
    String[] words = input.split(" "); 


    for (String word : words) { 

     // Second word on 
     if (sb.length() > 0) { 
      sb.append(" "); 
     } 
     sb.append(reverse(word)); 
    } 

    System.out.println(sb.toString()); 
} 

public static String reverse(final String s) { 
    StringBuilder sb = new StringBuilder(); 

    // Run from end to start 
    for (int i = s.length() - 1; i >= 0; i--) { 
     sb.append(s.charAt(i)); 
    } 

    return sb.toString(); 
} 
+0

Могу ли я сделать это без разделения? –

+0

Вы можете. Думаете ли вы, что вы ответите из Stackoverflow как на свое домашнее задание? –

+1

Обратите внимание, что 'sb.append (reverse (word))' может быть заменен на 's.append (new StringBuilder (word) .reverse())', то есть вам не нужно предоставлять свой собственный обратный метод. – Thomas

0

Это должно работать для вас.

public static void main(String[] args) { 
     System.out.println("Please enter a string: "); 
     Scanner sc=new Scanner(System.in); 
     String str= sc.nextLine(); 
     StringBuilder reverseWords = new StringBuilder(); 
     String[] words = str.split("\\s+"); // space(s) are the delimiters 

     for (String word : words) { //fetch a single word from inputted sentence 
      char[] charArray = word.toCharArray(); 
      int end = word.length() - 1;//length of word 

      StringBuilder revWords = new StringBuilder(); 
      for (int i = end; i >= 0; i--) {//start the loop from end to get the last char from words 
       revWords.append(charArray[ i]);//add the last char of word into stringbuilder 
      } 
      reverseWords.append(revWords); 
      reverseWords.append(" ");  // separate the words 
     } 
     System.out.print(reverseWords); 
     } 
Смежные вопросы