Обратный порядок символов слов в строке

Я пытался научиться Java, и один из способов, которым я учил себя, - это решить «вопросы, связанные с программированием».

Одним из таких вопросов является «обратный порядок символов слов в строке».

Например, " I have a hat " => " I evah a tah " (обратите внимание на пробелы). В моей реализации я не занимаюсь пунктуацией, поэтому "I have a hat!" => "I evah a !tah"

Я написал реализацию, и мне бы хотелось получить некоторую обратную связь, особенно в отношении читаемости и эффективности кода (в основном, есть ли более реалистичная реализация того, что я пытаюсь выполнить - мне ответ, да , особенно последняя часть моей реализации).

Реализация в основном делает следующее:

  • Создайте массив строк с размером элемента размером candidateReversedWordsString и инициализируйте его с помощью строки String
  • Создайте StringBuilder, который будет создавать все обратные слова.
  • Итерации через символы в строке
  • Если символ не является пробелом, а StringBuilder пуст, обратите внимание на значение символьного индекса в переменной wordStartIndex и добавьте символ к StringBuilder.
  • Если символ не является пространством, а StringBuilder не пуст, добавьте символ в StringBuilder
  • Если символ - это пробел, а StringBuilder не пуст, возьмите единственный элемент в массиве candidateReversedWordsString и в основном соедините элемент с измененным словом из StringBuilder с использованием подстрок.
  • Если у конечного символа и StringBuilder не пусто, небольшая корректировка конкатенации
 public String reverseWordsInString(final String string) {
    final String[] candidateReversedWordsString = new String[1];
    candidateReversedWordsString[0] = string;
    int stringCharacterIndex = 0;
    int wordStartIndex = 0;
    final StringBuilder reverseWordStringBuilder = new StringBuilder();
    while (stringCharacterIndex < string.length()) {
        if (' ' != string.charAt(stringCharacterIndex)) {
            if (reverseWordStringBuilder.length() == 0) {
                wordStartIndex = stringCharacterIndex;
            }
            reverseWordStringBuilder.append(string.charAt(stringCharacterIndex));
        }

        if (' ' == string.charAt(stringCharacterIndex) && reverseWordStringBuilder.length() > 0) {
            candidateReversedWordsString[0] = new StringBuilder().
                    append(candidateReversedWordsString[0].substring(0, wordStartIndex)).
                    append(reverseWordStringBuilder.reverse().toString()).
                    append(candidateReversedWordsString[0].substring(stringCharacterIndex)).toString();
            reverseWordStringBuilder.setLength(0);
        }

        if (stringCharacterIndex == string.length() - 1 && reverseWordStringBuilder.length() > 0) {
            candidateReversedWordsString[0] = new StringBuilder().
                    append(candidateReversedWordsString[0].substring(0, wordStartIndex)).
                    append(reverseWordStringBuilder.reverse().toString()).toString();
        }
        stringCharacterIndex++;
    }

    return candidateReversedWordsString[0];
}
8 голосов | спросил Jae Bradley 29 72015vEurope/Moscow11bEurope/MoscowSun, 29 Nov 2015 06:38:58 +0300 2015, 06:38:58

2 ответа


4
  

Есть ли более плавная реализация того, что я пытаюсь выполнить

«Slicker» субъективен, но я бы выбрал такой подход:

  • Когда вы видите непробельный символ, поместите его в стек
  • Когда вы видите символ пробела (или нажимаете на конец строки), вытолкните все элементы из стека в StringBuilder

Я не очень часто использую Java, но вот моя попытка:

private static String reverseWords(String s) {
  StringBuilder result = new StringBuilder();
  Stack<Character> word = new Stack<>();

  for (char c : s.toCharArray()) {
    if (Character.isWhitespace(c)) {
      while (!word.isEmpty()) {
        result.append(word.pop());
      }

      result.append(c);
    } else {
      word.push(c);
    }
  }

  while (!word.isEmpty()) {
    result.append(word.pop());
  }

  return result.toString();
}

Альтернатива, предложенная @ 200_success, заключается в замене стека на StringBuilder.

private static String reverseWords(String s) {
  StringBuilder result = new StringBuilder();
  StringBuilder word = new StringBuilder();

  for (char c : s.toCharArray()) {
    if (Character.isWhitespace(c)) {
      result.append(word.reverse());
      word.setLength(0);
      result.append(c);
    } else {
      word.append(c);
    }
  }

  return result.append(word.reverse()).toString();
}
ответил mjolka 29 72015vEurope/Moscow11bEurope/MoscowSun, 29 Nov 2015 10:56:59 +0300 2015, 10:56:59
3

Я думаю, что ваш метод излишне громоздок. Кажется более простым иметь StringBuilder, к которому вы добавляете обратное слово всякий раз, когда находите пробел. И хотя я не являюсь экспертом по внутренним разработкам Java, это почти наверняка будет более эффективным:

private StringBuilder appendReversedWord(
    final StringBuilder stringBuilder,
    final CharSequence string,
    final int wordStart,
    final int wordEnd) {
  if (wordEnd > wordStart) {
    stringBuilder
        .append(
            new StringBuilder(wordEnd - wordStart)
            .append(string, wordStart, wordEnd)
            .reverse());
  }
  return stringBuilder;
}

public String reverseWords(final String string) {
  final StringBuilder reversedStringBuilder = new StringBuilder(string.length());
  int stringIndex = 0;
  int wordStartIndex = 0;

  while (stringIndex < string.length()) {
    if (' ' == string.charAt(stringIndex)) {
      appendReversedWord(
          reversedStringBuilder,
          string,
          wordStartIndex,
          stringIndex);
      reversedStringBuilder.append(' ');
      wordStartIndex = stringIndex + 1;
    }
    stringIndex++;
  }

  appendReversedWord(
      reversedStringBuilder,
      string,
      wordStartIndex,
      stringIndex);

  return appendReversedWord.toString();
}
ответил Jaime 29 72015vEurope/Moscow11bEurope/MoscowSun, 29 Nov 2015 10:22:55 +0300 2015, 10:22:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132