@kobeza

Как сделать реверс строки с сохранением позиции отдельных символов?

Здравствуйте, необходимо сделать реверс строки на языке java с сохранением позиции отдельных символов.
Вот пример что нужно сделать:
Ввод "м1ама мыла рам5у"
Вывод "а1мам алым ума5р".

У меня получается сделать реверс разными способами, только вот не знаю как оставить цифры на своих местах.

Буду благодарен за полезные советы.
  • Вопрос задан
  • 506 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bedward70
Добрый день!
У вас ошибка, должно получится а1амм алым уам5р.
Наверное надо делать в ручную реверс слов с условием.
Примерно вот так (JAVA 1.8, PREDICATE - разрешает переставлять символы):
import java.util.StringJoiner;
import java.util.function.Function;

public class AppSwap {

    public static final String WORD_DELIMITER = " ";
    public static final Function<Character, Boolean> PREDICATE = character
        -> character < '0' || character > '9';

    public static void main(String[] args) throws Exception {

        final String originalSequence = "м1ама мыла рам5у";
        final String transformedSequence = transform(originalSequence);
        System.out.println(originalSequence);
        System.out.println(transformedSequence);
    }

    private static String transform(String originalSequence) {

        // Split делим на слова
        final String[] words = originalSequence.split(WORD_DELIMITER);

        // Transform преобразуем
        for (int i = 0; i < words.length; i++) {
            words[i] = transformWord(words[i], PREDICATE);
        }

        // Join объединяем в предложение
        final StringJoiner stringJoiner = new StringJoiner(WORD_DELIMITER);
        for (int i = 0; i < words.length; i++) {
            stringJoiner.add(words[i]);
        }
        return stringJoiner.toString();
    }

    private static String transformWord(final String inputWord, final Function<Character, Boolean> predicate) {

        final char[] chars = inputWord.toCharArray();
        for (int i = 0; i < chars.length / 2; i++) {

            final int startIndex = i;
            final int lastIndex = chars.length - 1 - i;
            if (
                predicate.apply(chars[startIndex])
                && predicate.apply(chars[lastIndex])
            ) {

                // Swap \ Обмен символами
                swapChars(chars, startIndex, lastIndex);
            }
        }
        return new String(chars);
    }

    private static void swapChars(final char[] chars, final int startIndex, final int lastIndex) {
        final char temp = chars[startIndex];
        chars[startIndex] = chars[lastIndex];
        chars[lastIndex] = temp;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы