2015-07-23 2 views
0

Я пытаюсь обратить каждые 2 слова каждого предложения, какReverse каждые 2 слова предложения

Если данная строка:

My name is xyz 

Желательный результат должен быть:

My eman is zyx 

Мой выходной ток:

Ym eman s1 zyx 

Я не в состоянии достичь желаемого мой output.Don't знаю, что я делаю неправильно здесь

Вот мой код

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" 

    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; 
} 
+6

Я запутался, как к вашим требованиям. Итак, вы хотите изменить любое другое слово? Просьба уточнить, что именно вы пытаетесь сделать. –

+0

Что такое рисунок здесь, вы хотите, чтобы даже слово позиции было отменено? – Bhupi

+0

Как указано, ваш вопрос неясен. Для этого есть готовая библиотека (реверсивный метод с обратной связью) https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#reverse (java.lang.String)? Но не знаю, чего вы хотите достичь. У меня такое же понимание проблемы, как MadConan –

ответ

0

Вы можете решить вашу проблему меняться легкий путь! Просто используйте переменную flag, которая укажет даже или нечетное местоположение, точнее, будет ли любое слово отменено или нет!

Посмотрите на следующей модификации я сделал в своем коде, просто добавили три дополнительные строки:

private static boolean flag = true;// added a variable flag to check if we reverse the word or not. 
private static char[] ReverseSentence(char[] sentence) 
{ 
    //Given: "Hi my name is person!" 
    //produce: "iH ym eman si !nosrep" 

    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 
     { 
      flag = !flag; // first time (odd position) we are not going to reverse! 
      //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 & flag){ //lets see whether we are going to reverse or not 

       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; 
} 

Входной

Меня зовут хуг

Выход:

My eman является ZYX

+0

. Спасибо. Просто нужно изменить флаг = true для флага = false –

+0

@ user4274413, именно так вы его получили и приветствуете , –

0

Следующий код делает этот «особый реверс», который переворачивает любой другой слово в предложении:

public static void main(String[] args) { 
    String sentence = "My name is xyz"; 
    System.out.println(specialReverse(sentence)); // My eman is zyx 
} 

private static String specialReverse(String sentence) { 
    String result = ""; 
    String[] words = sentence.split(" "); 
    // we'll reverse only every second word according to even/odd index 
    for (int i = 0; i < words.length; i++) { 
     if (i % 2 == 1) { 
      result += " " + reverse(words[i]); 
     } else { 
      result += " " + words[i]; 
     } 
    } 
    return result; 
} 

// easiest way to reverse a string in Java in a "one-liner" 
private static String reverse(String word) { 
    return new StringBuilder(word).reverse().toString(); 
} 
+0

Downvoter - прокомментировать? – alfasin

+2

Обычно полезно включать объяснение вашего решения, а не просто дамп кода. – Michelle

+0

@ Michelle Я согласен с вами в этом вопросе, хотя это довольно понятная ИМО. Добавлен пояснительный пример. Кроме того, комментарии к коду помогают объяснить отсутствие меньше, чем текст ... – alfasin

2

Если вы хотите, чтобы изменить альтернативное слово, которое вы можете попробовать что-то вроде разделив весь String в слова, разделённых пробелами и применять StringBuilder reverse() на каждом втором слове, как: -

 String s = "My name is xyz"; 
     String[] wordsArr = s.split(" "); // broke string into array delimited by " " whitespace 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0 ; i< wordsArr.length; i++){ // loop over array length 
      if(i%2 == 0) // if 1st word, 3rd word, 5th word..and so on words 
       sb.append(wordsArr[i]); // add the word as it is 
      else sb.append(new StringBuilder(wordsArr[i]).reverse()); // else use StringBuilder revrese() to reverse it 
      sb.append(" ");// add a whitespace in between words 
     } 
     System.out.println(sb.toString().trim()); //remove extra whitespace from the end and convert StringBuilder to String 

Выход: - My eman is zyx

+1

nvm, я думаю, в 'if 1, 3rd, 5th .. и так далее слова' вы считаете от 1, а не 0:) – Pshemo

+0

@Pshemo на самом деле я указываю слова, т. Е. 1-е слово 3-го слова и т. Д., А не индекс;) –

+1

Кстати, вам не нужно вызывать 'toString()' on 'StringBuilder' добавить его. 'append' метод принимает любую' CharSequence', а не только 'String' (и StringBuilder реализует CharSequence). – Pshemo

0

Просто для полноты здесь Java-8 Решение:

public static String reverseSentence(String input) { 
    String[] words = input.split(" "); 
    return IntStream.range(0, words.length) 
      .mapToObj(i -> i % 2 == 0 ? words[i] : 
        new StringBuilder(words[i]).reverse().toString()) 
      .collect(Collectors.joining(" ")); 
} 

reverseSentence("My name is xyz"); // -> My eman is zyx 
Смежные вопросы