Обработка строк по нажатию JAVA

401
05 сентября 2021, 20:50

Столкнулась с такой проблемой. Скопирую ниже задание для какого-то понимания кода (лаба в шараге).

Проблема в первом пункте, не приходит в голову как его сделать, убила на это несколько недель, остальное готово.

Что пытаюсь сделать: отдельно записать все до числа, число и после числа, увеличить число и собрать снова, но чисел в тексте может быть несколько. не могу продумать как записать начало, чтобы оно потом перезаписывалось, когда зайдем обратно в цикл, чтобы искать следующее число.

            myButton1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    if( peremennaya==1) {
                        String text = input.getText();
                        int fir=0;
                        int sec=0;
                        int n=0;
                        int numb1 =0;
                        int numb2 =0;
                        int sum=0;
                        String first_word="";
                        String second_word="";
                        String full_word="";
                        String numword="";
                        // int start=0; индекс первого символа
                        // в fir и sec записываются последний индекс первого слова и индекс первого символа второго символа
                        //numb1 и numb2 - индексы начала и конца чилса, которое нужно прибавить на 25
                        // first_word - переменная, в которую записывается все до числа
                        // first_word - переменная, в которую записывается все после числа
                        // numword - перевод числа в строку
                        // full_word - собираем все 3 переменные в одну
                        for (int i = 0; i<text.length(); i++) {
                            if ((text.charAt(i)>='0')&&(text.charAt(i)<='9')) {
                                if ((text.charAt(i-1)<='0')&&(text.charAt(i-1)>='9')) {
                                    fir=i-1;
                                    numb1=i;
                                } 
                                if ((text.charAt(i+1)<='0')&&(text.charAt(i+1)>='9')) {
                                    sec=i+1;
                                    numb2=i;
                                } 
                            }
                        }
                            for (int j=numb1;j<=numb2;j++) {
                            //  _______Переписать_____
                            // sum = Integer.parseInt(""+text.charAt(j))+sum;
                                if (j<numb2) sum=sum*10;
                            }
                            // из одной строки в другую скопировать в другую несколько символов
                            // после перевод этой строки в число
                             sum+=25; 
                            for (int j=fir;j<=fir;j++) { //вместо fir - start
                                first_word=first_word+text.charAt(j);
                            }
                            for (int j=sec;j<text.length();j++) {
                                second_word=second_word+text.charAt(j);
                            } 
                            numword = Integer.toString(sum);
                            full_word = first_word+numword+second_word;
                            output.setText(second_word);


                        }
Answer 1

Аня, такую задачку проще всего решить с помощью регулярного выражения. Замените у себя этот участок кода if( peremennaya==1) {...} на мой и все будет работать:

if( peremennaya==1) {
    String text = input.getText();
    // "-?\\d+" - регулярное выражение для поиска в тексте положительных и отрицательных чисел
    Pattern p = Pattern.compile("-?\\d+"); 
    Matcher m = p.matcher(text);
    // при увеличении чисел в тексте, текст может удлинятся, 
    // нужно учитывать это удлинение при замене (например было 8, стало 33)
    int shift = 0; // это сдвиг - величина компенсации увеличения длины текста
    while (m.find()) { // в цикле будут обрабатываться все найденные числа в тексте
        int oldLength = text.length(); // измерение длины текста перед заменой
        String oldNum = m.group(); // получение числа из текста
        String newNum = String.valueOf(Integer.parseInt(oldNum) + 25); // добавление к нему 25
        // замена в тексте числа на его измененный вариант с учетом текущего сдвига
        text = text.substring(0, m.start() + shift) + newNum + text.substring(m.end() + shift);
        // получение новой величины сдвига с учетом изменения длины строки
        shift += text.length() - oldLength; 
    }
    output.setText(text);
}

Добавила комментарии, чтобы вам было легче разобраться

Answer 2

Для примера на коленке, можно и проще

public static void main(String[] args) {
        String str = "На полке стояло 5 чашек и 3 тарелки";
        String[] strings = str.split(" ");
        for (int i = 0; i < strings.length; i++) {
            if (strings[i].matches("\\d+")) { // полность цифра
                try {
                    long number = Long.parseLong(strings[i]);
                    strings[i] = Long.toString(number + 25);
                } catch (NumberFormatException e) {
                    // logging
                }
            } else if (strings[i].matches("\\d+\\D+")) { // может быть со знаками припинания в конце, например точка
                int index = strings[i].length() - 1;
                while (true) {
                    if (Character.isDigit(strings[i].charAt(index))) {
                        break;
                    }
                    index--;
                }
                try {
                    String tmp = strings[i].substring(0, index + 1);
                    long number = Long.parseLong(tmp);
                    strings[i] = "" + (number + 25) + strings[i].substring(index + 1);
                } catch (NumberFormatException e) {
                    // logging
                }
            } else if (strings[i].matches("\\D+\\d+")) { // может быть со знаком припинания вначале, например кавычка
                // TODO
            } else if (strings[i].matches("\\D+\\d+\\D+")) { // может быть между знаками припинания, в кавычках и точкой в конце
                // TODO можно 3 условия соединить в один "\\D*\\d+\\D*"
            }
        }
        String encrypted = String.join(" ", strings);
        System.out.println(encrypted);
    }
READ ALSO
Почему не работает валидация над объектами типа DTO , а только над сущностями

Почему не работает валидация над объектами типа DTO , а только над сущностями

У меня установлена аннотация над объектами типа dto, такая же как и над объектами типа EntityНад сущностями аннотация срабатывает, а над объектами...

299
Промис в JavaScript

Промис в JavaScript

Полифил для PromiseallSettled:

111
Остановка таймера в DOM-элементе

Остановка таймера в DOM-элементе

Есть код таймера на JS:

85