Есть ли способ изменить слова с сохранением позиции - PullRequest
0 голосов
/ 31 марта 2020

Мне нужна функция, которая принимает строку в качестве входных и реверсивных слов с регистром сохранения позиции.

Пример:

Ввод: "HeLlo woRld BEn"

Вывод: "olLeh dlRow NEb"

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Мы разбиваем исходное предложение на слова и переворачиваем их, используя StringBuilder@reverse. Затем мы создаем массив символов, представляющий исходные слова и обращенные слова. Затем мы проводим все символы через l oop и проверяем правильность регистра, проверяя прописные и строчные буквы.

    String reverse(String sentence) {
        char[] characters = sentence.toCharArray();

        String reversed = Stream.of(sentence.split(" "))
                .map(word -> new StringBuilder(word).reverse())
                .collect(Collectors.joining(" "));

        char[] reversedCharacters = reversed.toCharArray();

        for (int index = 0; index < reversedCharacters.length; index++) {
            char characterAtIndex = characters[index];

            char characterAtReversedIndex = reversedCharacters[index];

            if (Character.isUpperCase(characterAtIndex) && Character.isLowerCase(characterAtReversedIndex)) {
                reversedCharacters[index] = Character.toUpperCase(characterAtReversedIndex);
            } else if (Character.isLowerCase(characterAtIndex) && Character.isUpperCase(characterAtReversedIndex)) {
                reversedCharacters[index] = Character.toLowerCase(characterAtReversedIndex);
            }
        }
        return new String(reversedCharacters);
    }
0 голосов
/ 31 марта 2020

Сделайте это следующим образом:

public class Main {
    public static void main(String[] args) {
        System.out.println(reverseWordsRetainingPositionCase("HeLlo woRld BEn"));
    }

    static String reverseWordsRetainingPositionCase(String str) {
        String[] words = str.split("\\s+");// Split the string on space(s)
        StringBuilder sb = new StringBuilder(str);// Create a StringBuilder instance with the content of str
        for (String word : words) {
            // Find the word in sb and replace it with its reverse
            sb.replace(sb.indexOf(word), sb.indexOf(word) + word.length(), reverseCharsRetainingPositionCase(word));
        }
        return sb.toString();
    }

    static String reverseCharsRetainingPositionCase(String word) {
        StringBuilder reversedWord = new StringBuilder(word).reverse();// Reverse the word
        for (int i = 0; i < word.length(); i++) {
            // If the character at i in the word is in upper case, change the case of the
            // character at i in the reversed word to upper case. Process the reversed word
            // in the same way for lower case.
            if (Character.isUpperCase(word.charAt(i))) {
                reversedWord.setCharAt(i, Character.toUpperCase(reversedWord.charAt(i)));
            } else if (Character.isLowerCase(word.charAt(i))) {
                reversedWord.setCharAt(i, Character.toLowerCase(reversedWord.charAt(i)));
            }
        }
        return reversedWord.toString();
    }
}

Вывод:

OlLeh dlRow NEb

Я добавил достаточно комментариев в код, чтобы его было легче понять. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...