2015-03-08 3 views
1

Я пытаюсь сделать код, который полностью изменить это строка, я знаю, что есть более простые способы сделать это, но я просто хотел бы знать, почему этот код не работает:Java обратная строка

public class Reverse 
{ 
    /** 
    * Prints a post backwards to hide its contents. 
    * @param post the post to be reversed. 
    */ 
    public String reverse(String post) 
    { 
     String newpost = ""; 
     for (int i = post.length(); i > 0; i++); 
     { 
      String letter = post.substring(post.length() - 1, post.length()); // gets the last character of the post 
       post = post.substring(0,post.length()-1); //removes the last character of the post 
      newpost = newpost + letter; //adds the last character of the post to newpost 
    } 
    return newpost; 
} 

Результат :

Вход: Как я программировал без петель ?!

Актуально:!

Ожидаемое:? Намотать tuohtiw margorp Reve Я сделал WOH

Input: Это так в обратном направлении!

Актуально:!

Ожидаемое: sdrawkcab ОС s'tahT

+1

Почему, по вашему мнению, это должно сработать? –

+0

получает последнюю букву сообщения, чем удаляет это из сообщения, а затем добавляет это в newpost, поэтому вы должны получить с помощью ввода: hello: o чем ol, чем oll, чем olle tahn olleh –

+2

Вы увеличиваетесь, когда вам нужно декрементирование. и в цикле for сделайте 'i> = 0'. – Brunaldo

ответ

3

У вас есть дополнительный ; в строке вашего цикла:

for (int i = post.length(); i > 0; i++); 

Так что ваш код замена выполняется только один раз. Это легко заметить, если вы используете редактор с возможностями форматирования кода (в моем случае Eclipse, но любой другой IDE должен делать).

И для полноты картины - на вероятно, самый простой (встроенный) способ изменить строку:

(new StringBuilder(post)).reverse().toString() 

Update:

Как MCT и Pshemo уже указывалось, дополнительно ; - не единственная проблема. Вы должны декрементаi в цикле, в противном случае вы столкнетесь с StringIndexOutOfBoundsException в строке

String letter = post.substring(post.length() - 1, post.length());

когда post стала пустой строкой.

И так как мы уже начали говорить о хороших практиках: вы должны выполнять строковые операции в цикле, используя StringBuilder по соображениям производительности (хотя, вероятно, это не ваша главная проблема прямо сейчас), ср. this Stack Overflow question.

+0

Я не видел вашу подачу StringBuilder перед тем, как я опубликовал. Для полноты вам нужно добавить круглые скобки (новый StringBuilder (strin)). Reverse(). ToString(). Иначе отличная работа. – lacraig2

+0

@ lacraig2: Скобки на самом деле не нужны. – Marvin

+2

Не нужна, но хорошая практика. Когда вы получаете много нового ClassA (новый ClassB()), он становится запутанным. Это точка скобок. – lacraig2

0

Парень выше скорректировал ваш код. Он сделал большую работу. Однако в java вы можете сделать это легко в одной строке. Вот лучшее решение:

String reverse = (new StringBuffer(initialString)).reverse().toString(); 

Если вы установили новый StringBuffer в строку, которую вы хотите, и затем назад и затем установить его в строку вы можете избежать петель в целом.

Вот это все вместе:

public class Reverse{ 
    public String reverse(String post){ 
     return ((new StringBuffer(post)).reverse().toString()); 
    }  
} 

Надеется, что это помогает.

1

Просто, чтобы добавить к ответу Марвина выше, вы также должны уменьшать I, а не увеличивать его

for (int i = post.length(); i > 0; i--) 

Это наряду с тем, что сказал Марвин даст вам правильное решение, хотя есть гораздо более простые способы, чтобы сделать это!

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