@Ilya_Zhuravlev2002

Как улучшить код?

import java.util.Scanner;

public class Main2 {

    public static void main(String[] args) {
        System.out.println(textModifier());
    }

    public static String textModifier() {
        Scanner scanner = new Scanner(System.in);
        String inputText = scanner.nextLine();
        scanner.close();

        // Process the text according to the given conditions
        // a. Removing extra spaces
        inputText = inputText.replaceAll("\\s+", " ");

        // b. Swapping characters around "-"
        inputText = swapCharacters(inputText, '-');

        // c. Replacing "+" with "!"
        inputText = inputText.replace("+", "!");

        // d. Calculating the sum of digits and removing them
        int sumOfDigits = calculateSumOfDigits(inputText);
        inputText = inputText.replaceAll("\\d", "");
        inputText += " " + sumOfDigits;

        return inputText;
    }

    private static String swapCharacters(String text, char target) {
        StringBuilder result = new StringBuilder();
        char[] chars = text.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == target && i > 0 && i < chars.length - 1) {
                result.append(chars[i + 1]);
                result.append(chars[i - 1]);
                i++; // Skip the next character as it is already processed
            } else {
                result.append(chars[i]);
            }
        }
        return result.toString();
    }

    private static int calculateSumOfDigits(String text) {
        int sum = 0;
        for (char c : text.toCharArray()) {
            if (Character.isDigit(c)) {
                sum += Character.getNumericValue(c);
            }
        }
        return sum;
    }
}
Задача: реализовать метод textModifier, который считывает из консоли текст, введённый пользователем и меняет его согласно описанному алгоритму.
public static String textModifier() // этот метод надо реализовать
Результатом работы метода является возврат строки (текста) с учётом всех изменений.

Результатом работы программы является вывод в консоль изменённого текста согласно всем условиям:

1. Пользователь вводит текст одной строкой и нажимает “enter”.

2. В тексте могут присутствовать различные специальные символы, которые надо обрабатывать согласно условиям ниже:

a. Если в тексте между словами присутствует несколько пробелов подряд, надо оставить только один из них. Для реализации этого подпункта нельзя пользоваться методами replace() и replaceAll().

b. Если в тексте присутствует знак минус (-), это значит, что символ слева от этого знака надо поменять местами с символом, который стоит справа от этого знака. Обратите внимание, что символом может быть не только буква, но и число или любой другой знак/символ, в том числе символ пробела. После смены символов местами, знак минус (-) надо удалить из строки результата.

c. Если в тексте присутствует знак плюс (+), вам необходимо заменить его на восклицательный знак (!).

d. В тексте могут присутствовать цифры (от 0 до 9). Вам необходимо посчитать их сумму и удалить из текста. Сумму цифр вам нужно добавить в конец результирующей строки через пробел (пробел должен стоять перед суммой цифр).
Все манипуляции с текстом должны выполняться ровно в той последовательности, которая описана в пункте 2. То есть, сначала выполняется пункт A, затем пункт B, затем C и D. Это важно для получения корректного итогового результата.
Пример ввода:

генрих1 играет+2 л-июбит0школу

Пример вывода:

генрих играет! илюбитшколу 3

Пример ввода №2:

Я ю-лбю-л джаву всем сердцем+

Пример вывода:

Я люблю джаву всем сердцем! ( ссылка на моё решение.)
  • Вопрос задан
  • 294 просмотра
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Так не делается.

Согласно лучшим практикам (best practices), ты должен сначала покрыть
свой код тестами.
Тоесть представить на наше обозрение проект, который
компилируется и тестируется. И после этого мы сможем предлагать различные
improovements для кода базируясь на улучшении производительности
и на уменьшении например метрик code complexity.

При этом все изменения не должны ломать тесты. Это - очень важно.

По коду. Непонятно, почему в методе swapCharacters ты применил StringBuilder
и в то-же время в textModifier ты решил использовать replace и конкатенацию
строк. По отдельности к каждому методу нет вопросов. Но есть вопрос по единообразию
кода. Уж коли ты решился на суровые оптимизации скорости - то нужно выдерживать
работу в таком ключе. Это - совет по конвенции кода по отношению к своим проектам.
Договорись сам с собой. Тебе важен перформанс или просто ты делаешь POC и тебе нужен краткий код?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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