Обратная строка слово за словом в 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 ]

1 голос
/ 25 октября 2013

Другое решение без использования метода разбиения

    public static String reverseWordsWithoutSplit(String str) {
    StringBuffer buffer = new StringBuffer();
    int length = str.length();
    while(length >0) {
        int wordstart = length -1;
        while(wordstart >0 && str.charAt(wordstart) != ' '){
            wordstart--;
        }
        buffer.append(str.substring(wordstart==0?wordstart:wordstart+1, length));
        if(wordstart>0)
            buffer.append(" ");
        length = wordstart;
    }
    return buffer.toString();
}
1 голос
/ 23 декабря 2015

Вот метод кодирования с использованием популярной функции split (), которая доступна на всех основных языках, Java toCharArray (), которая подходит для полного контроля над символами в строковой форме, и Java * 1003.* класс для повышения производительности (также доступен в C #).

Я думаю, что код легче понять по сравнению с другими опубликованными ответами

public static String reverseWordByWord(String sentence) {
    StringBuilder result = new StringBuilder();
    String[] words = sentence.split("\\s+");   // space(s) are the delimiters

    for (String word : words) {
        char[] charArray = word.toCharArray();
        int iEnd = word.length() - 1;

        StringBuilder temp = new StringBuilder();
        for (int i = iEnd; i >= 0; i--) {
            temp.append(charArray[ i]);
        }
        result.append(temp);
        result.append(" ");     // separate the words
    }
    return result.toString().trim();    // remove the trailing spaces
}

Напоминание о требованиях, опубликованных автором.
Пример вход : «Hello World»
Выход : «olleH dlroW»

1 голос
/ 19 февраля 2015

Ответ на удаление начального пробела прост: просто

return reverse.trim();

String.trim() возвращает копию строки с пропущенными начальным и конечным пробелами (как скопировано из документации Javadoc).

Для вашей общей проблемы я составил этот пример:

String job = "This is a job interview question!";
StringBuilder sb = new StringBuilder(job);
String[] words = job.split(" ");
int i = 0;
for (String word : words) {
    words[i] = (new StringBuilder(word)).reverse().toString();
    i++;
}

System.out.println("job = " + job);
System.out.print("rev = ");
for (String word: words) {
    sb.append(new StringBuilder(word).toString());
    sb.append(" ");
}

String rev = sb.toString().trim();
System.out.println(rev);

, и получим результат:

job = This is a job interview question!
rev = sihT si a boj weivretni !noitseuq

Если вы хотите быть более инклюзивным из любыхсимвол пробела, например символ табуляции, разрыв строки, перевод формы, затем измените аргумент split() на split("\\s"), так как \s - это класс символов регулярного выражения, который воплощает [\ t \ r \ n \ f].Обратите внимание, как вы должны экранировать символ обратной косой черты в вашем строковом представлении Java регулярного выражения (именно этого ожидает метод split).

1 голос
/ 14 января 2015

Вот одна тема, также обсуждающая эту проблему.Я думаю, что один ответ с использованием split с регулярным выражением очень умный.

https://codereview.stackexchange.com/questions/43838/reverse-a-string-word-by-word

public String reverseWordByWord(String s) {
  StringBuilder result = new StringBuilder();
  String[] words = sentence.split("\\s+");      
  for (int i = words.length - 1 ; 0 <= i; i--) {
    result.append(words[i]).append(' ');
  }
  return result.toString().trim();
}
1 голос
/ 21 апреля 2014

Другое решение. Это решение на месте.

Обратные слова в строке (слова разделяются одним или несколькими пробелами), пробелы могут предшествовать словам, то есть пробел в начале предложения, конце и т. Д.

public class ReverseWordsInString {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    char[] sentence = "  Hi my name is person!".toCharArray();
    System.out.println(ReverseSentence(sentence));  

}
private static char[] ReverseSentence(char[] sentence)
{
    //Given: "Hi my name is person!"
    //produce: "iH ym eman si !nosrep"
    //the obvious naive solution: utilize stringtokenize to separate each word into its own array. reverse each word and insert space between each array print
    //better solution: drop stringtokenize and use a counter to count how many characters processed before space was hit. 
    //                 once space hit, then jump back swap characters between counter-1 and start position. O(1) Space

    if(sentence == null) return null;
    if(sentence.length == 1) return sentence;       

    int startPosition=0;
    int counter = 0;
    int sentenceLength = sentence.length-1;

    //Solution handles any amount of spaces before, between words etc...    

    while(counter <= sentenceLength)
    {
        if(sentence[counter] == ' ' && startPosition != -1 || sentenceLength == counter) //Have passed over a word so upon encountering a space or end of string reverse word
        {
            //swap from startPos to counter - 1
            //set start position to -1 and increment counter
            int begin = startPosition;

            int end;
            if(sentenceLength == counter)
            {
                end = counter;
            }
            else                
                end = counter -1;
            char tmp;

        //Reverse characters
            while(end >= begin){

                tmp = sentence[begin];
                sentence[begin] = sentence[end];
                sentence[end] = tmp;

                end--; begin++;

            }               

            startPosition = -1; //flag used to indicate we have no encountered a character of a string


        }

        else if(sentence[counter] !=' ' && startPosition == -1) //first time you encounter a letter in a word set the start position
        {
            startPosition = counter;
        }

        counter++;  
    }

    return sentence;        
}

}

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

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

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

1 голос
/ 02 марта 2015

как поменять слово в java

public class ReverseString {

public static void main(String[] args) {
    String reverse = "";
    String original = new String("hidaya");

      for ( int i = original.length() - 1 ; i >= 0 ; i-- )
         reverse = reverse + original.charAt(i);

      System.err.println("Orignal string is: "+original);
      System.out.println("Reverse string is: "+reverse);
    }
}
0 голосов
/ 03 мая 2012

Возьмите String и используя Stack методы с StringTokenizer Object, и с помощью его методов мы можем разрезать String на кусок Слова, используя delimeter. С помощью функции Stack Natural вставьте (push) все слова в Satck и удалите (pop) все слова из стека. затем распечатать все.

Здесь мы можем взять строку s = "здравствуй, храбрый новый мир"

import java.util.*;
 public class StringReverse {   
  public static void main(String[] argv) { 
      String s = "hello brave new world";      
      Stack<String> myStack = new Stack<String>();
      StringTokenizer st = new StringTokenizer(s); 
        while (st.hasMoreTokens())
           myStack.push((String) st.nextElement());      
           // Print the stack backwards     
           System.out.print('"' + s + '"' + " backwards by word is:\n\t\"");     
         while (!myStack.empty()) {        
           System.out.print(myStack.pop());       
           System.out.print(' ');     
        }     System.out.println('"');
    } 
} 

Если вы используете какой-либо собственный пакет, проверьте Вывод вышеуказанной программы .

0 голосов
/ 28 ноября 2014
public class WordReverse {

static StringBuilder sb = new StringBuilder();

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the correct Sentence :");
    String str = sc.nextLine().replaceAll("\\s+", " ");         //remove unwanted space using regex

    int lastIndex = 0, i = 0;

    for (char chars : str.toCharArray()) {
        if (chars != ' ') {
            i++;
        } else {
            myReverse(str.substring(lastIndex, i).toCharArray());
            lastIndex = i + 1;
            i++;
        }
    }
    myReverse(str.substring(lastIndex, i).toCharArray());       //reverse the last word

    System.out.println(sb);
}
public static void myReverse(char c[]) {
    for (int i = (c.length - 1) ; i >= 0 ; i--) {
        sb.append(c[i]);
    }
    sb.append(" ");
} }
0 голосов
/ 21 августа 2014
/* this code uses while loop and the position of spaces come correctly which is 
  a problem if you use for loop */


import java.util.*;
class StrWordRev
{
public void rev(String s)
    {
        for(int i=s.length()-1;i>=0;i--)
        {
            System.out.print(s.charAt(i));
        }
        System.out.print(" ");
    }

public void main()
{
    Scanner sc=new Scanner(System.in);
    String s,s1="";
    System.out.println("Enter the string : ");
    s=sc.nextLine();
    int i=0;
    while(i<s.length())
    {
        s1="";
        while(i<s.length() && s.charAt(i)!=' ')
        {
            s1=s1+s.charAt(i);
            i++;
        }
        rev(s1);
        i=i+1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...