Обратная строка слово за словом в Java - PullRequest
6 голосов
/ 02 февраля 2012

У меня есть следующий код, чтобы поменять строку слово за словом, хотя у меня есть вопрос, может ли кто-нибудь сначала указать, как сделать этот код лучше?и во-вторых, как я могу удалить пробел, который у меня заканчивается в начале новой строки.

String str = "hello brave new world";
tStr.reverseWordByWord(str)

public String reverseWordByWord(String str){
        int strLeng = str.length()-1;
        String reverse = "", temp = "";

        for(int i = 0; i <= strLeng; i++){
            temp += str.charAt(i);
            if((str.charAt(i) == ' ') || (i == strLeng)){
                for(int j = temp.length()-1; j >= 0; j--){
                    reverse += temp.charAt(j);
                    if((j == 0) && (i != strLeng))
                        reverse += " ";
                }
                temp = "";
            }
        }

        return reverse;
    }

фраза на данный момент становится такой:

olleh evarb wendlrow

обратите внимание на пробел в начале новой строки.

Ответы [ 34 ]

7 голосов
/ 11 сентября 2012

Если не использовать функцию разделения, код будет выглядеть так:

public static void reverseSentance(String str) {
    StringBuilder revStr = new StringBuilder("");
    int end = str.length(); // substring takes the end index -1
    int counter = str.length()-1;
    for (int i = str.length()-1; i >= 0; i--) {     
        if (str.charAt(i) == ' ' || i == 0) {
            if (i != 0) {
                revStr.append(str.substring(i+1, end));
                revStr.append(" ");
            }
            else {
                revStr.append(str.substring(i,end));
            }
            end = counter;
        }
        counter--;
    }
    System.out.println(revStr);
}
5 голосов
/ 01 ноября 2012

If str = "Быстрая коричневая лиса перепрыгнула через ленивую собаку!" он вернет его как "собака! ленивый перескочил лиса коричневого быстро" ...

  private static String Reverse(String str) {
      char charArray[] = str.toCharArray();
    for (int i = 0; i <str.length(); i++){
        if(charArray[i] == ' ')
        return Reverse(str.substring(i + 1)) + str.substring(0, i) + " ";
    }

    return str + " ";
}
3 голосов
/ 02 февраля 2012

Вот как вы можете это сделать:

    StringBuilder result = new StringBuilder();
    StringTokenizer st = new StringTokenizer(input, " ");
    while (st.hasMoreTokens()) {
        StringBuilder thisToken = new StringBuilder(st.nextToken());
        result.append(thisToken.reverse() + " ");
    }
    String resultString = result.toString();
2 голосов
/ 12 июля 2012

Мой подход с использованием StringUtils. В модульном тесте.

@Test
public void testReversesWordsAndThenAllCharacters(){
    String sentence = "hello brave new world";
    String reversedWords = StringUtils.reverseDelimited(sentence, ' ');
    String reversedCharacters = StringUtils.reverse(reversedWords);
    assertEquals("olleh evarb wen dlrow", reversedCharacters);
}

Если вы статически импортируете StringUtils, это может быть встроено в:

reverse(reverseDelimited("hello brave new world", ' '))
1 голос
/ 02 февраля 2012

Попробуй это.Он учитывает знаки препинания и пробельные символы любого типа.

public String reverseWordByWord(String inputStr)
{
    BreakIterator wordIterator = BreakIterator.getWordInstance();
    wordIterator.setText(inputStr);
    int start = wordIterator.first();
    StringBuilder tempBuilder;
    StringBuilder outBuilder = new StringBuilder();
    for (int end = wordIterator.next(); end != BreakIterator.DONE; start = end, end = wordIterator.next())
    {
        tempBuilder = new StringBuilder(inputStr.substring(start, end));
        outBuilder.append(tempBuilder.reverse());
    }
    return outBuilder.toString();
}
1 голос
/ 02 февраля 2012

Вы можете использовать StringUtils

return StringUtils.reverseDelimitedString(str, " ");
1 голос
/ 02 февраля 2012

Как насчет использования чего-то подобного?

String string="yourWord";
String reverse = new StringBuffer(string).reverse().toString();
1 голос
/ 01 марта 2013
public class StringReversers {

    public static void main(String[] args) {
        String s = new String(revStr("hello brave new world"));
        String st = new String(revWords("hello brave new world"));
        System.out.println(s);
        System.out.println(st);
    }

    public static String revStr(String s){
        StringBuilder sb = new StringBuilder();
        for (int i=s.length()-1; i>=0;i--){
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }

    public static String revWords(String str) {
        StringBuilder sb = new StringBuilder();
        String revd = revStr(str);
        for (String s : revd.split(" ")){
            sb.append(revStr(s));
            sb.append(" ");
        }
        return sb.toString();
    }

}
1 голос
/ 02 февраля 2012

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

for(int j = temp.length()-1; j >= 0; j--)
{
    reverse += temp.charAt(j);
    if((j == 0) && (i != strLeng))
        reverse += " ";
}

Будет вызовом функции / метода.

Кроме того, чтобы сделать ваш код более производительным, вместо объединения строк с помощью оператора +, я бы использовал класс буфера строк. Например, StringBuffer или StringBuilder.

1 голос
/ 23 сентября 2013
public static void reverseByWord(String s) {

        StringTokenizer token = new StringTokenizer(s);

        System.out.println(token.countTokens());
        Stack<String> stack = new Stack<String>();
        while (token.hasMoreElements()) {
            stack.push(token.nextElement().toString());
        }

        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...