2015-10-25 2 views
1

Так что я пытаюсь отменить предложение, и хотя у меня нет ошибок при компиляции, он говорит мне, что мое обратное предложение выходит за рамки.Предложение реверса в java

-Он должен работать следующим образом: «привет, мир!». ! -> dlrow, olleh»

Указанный код:

String sentence="this is a sentence!"; 
    String reverseSentence=sentence; 
    for(int counter=0;counter<sentence.length();counter++) 
    { 
     char charToReplace,replaceChar; 

     charToReplace = reverseSentence.charAt(counter); 
     replaceChar = sentence.charAt(sentence.length()-counter); 

     reverseSentence=reverseSentence.replace(charToReplace, replaceChar); 

     System.out.println(reverseSentence); 
    } 
+2

'replace' не делать то, что вы думаете, что делает здесь. Прочтите его Javadoc. – Tunaki

+0

И зачем вообще заменять? Почему вы не используете StringBuilder и добавляете символы входной строки в обратном порядке? – GhostCat

ответ

2

Причина исключения вы получаете то, что в sentence.charAt(sentence.length()-counter), sentence.length()-counter находится вне границ, когда счетчик 0. Должно быть sentence.length()-1-counter

.

Однако, как отметил Tunaki, есть и другие проблемы, связанные с вашим кодом. Я предлагаю вам использовать StringBuilder построить обратную String, вместо того, чтобы использовать replace (который заменит любое вхождение первого символа с вторым символом).

+0

Спасибо, Эран! Пробовал и делал это так, как должен! –

1

Это не показывает вам ошибку, поскольку Исключение относительно индексов происходит в RunTime.

Здесь:

replaceChar = sentence.charAt(sentence.length()-counter); 

Вы пытаетесь получить доступ к индексу 19 вашего String (19-0). Замените его:

replaceChar = sentence.charAt(sentence.length()-counter-1); 

Я рекомендовал бы использовать в вашей ситуации StringBuilder хотя.

Либо использовать reverse() метод:

String sentence = "this is a sentence!"; 
String reversed = new StringBuilder(sentence).reverse().toString(); 
System.out.println(reversed); // Prints : !ecnetnes a si siht 

Или использовать метод append() для создания вашего нового объекта String. Это использует меньше памяти, чем при использовании String, потому что он не создает новую String объект каждый раз, когда вы будете зацикливание:

String sentence = "this is a sentence!"; 
StringBuilder reversed = new StringBuilder(); 

for (int i = 0 ; i < sentence.length() ; i++){ 
    reversed.append(sentence.charAt(sentence.length() - 1 - i)); 
} 

System.out.println(reversed.toString()); // Prints : !ecnetnes a si siht 
1

Вы можете использовать массивы символов, чтобы реализовать требования, как это,

String sentence = "ABDEF"; 
    char[] firstString = sentence.toCharArray(); 
    char[] reversedString = new char[sentence.length()]; 

    for (int counter = 0; counter < sentence.length(); counter++) { 
     reversedString[counter] = firstString[sentence.length() - counter -1]; 
    } 
    System.out.println(String.copyValueOf(reversedString)); 
0

Возможно, лучше сделать это без замены, или для цикла. Это вы создаете массив символов из строки, отбрасываете массив, а затем создаете строку из реверсивного массива, это будет делать то, что вы просили, без каких-либо движущихся частей или замен. Например:

String hw = "hello world"; 
    char[] hwChars = hw.toCharArray(); 
    ArrayUtils.reverse(hwChars); 
    String wh = new String(hwChars); 
    System.out.println(wh); 
0

Просто разделить строку на каждом пробельных и поместить его в массив строк, а затем распечатать массив в обратном порядке

public static void main(String[] args) { 
    String sentence = "this is a sentence!"; 
    String[] reverseSentence = sentence.split(" "); 

     for (int i = reverseSentence.length-1; i >= 0; i--) { 
     System.out.print(" " + reverseSentence[i]); 
     } 

    } 
+0

Это печатает слова в предложении в обратном порядке, но символы в словах все еще находятся в правильном порядке. OP также имеет символы в словах. – robjwilkins

Смежные вопросы