Не могу понять,в чём ошибка

122
17 февраля 2022, 01:10

Только начал изучать принципы "ООП".
Хотел сделать программу, которая считывает символы, переводит их в смайликовый формат.

Столкнулся с проблемой не понимания.

Что именно мне не понятно:

Мне не ясно почему, вызывая метод "getstr", возвращается та же строка что я ввёл через сканер, а не та что должна была(по-идее) перекодироваться.

package MySense;
import java.util.ArrayList;
import java.util.Scanner;
public class MainString {
    Wrap wla;
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String ob = s.nextLine();
        char[] array1 = new char[ob.length()];
        Wrap wlast = new Wrap(ob);
        System.out.println(wlast.getStr());
    }
    public void write(int y) {
        char[] array1 = new char[100];
        char[] r = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'щ', 'Ъ', 'ы', 'ь', 'э', 'ю', 'я', ' '};
        char[] t = {'@', '&', '#', '^', ':', '(', ')', '໒', '◐', '✪', '卍', '♣', '☯', '§', '۞', '♖', 'ஜ', '☭', '⚜', '♜', '⊒', '⊊', 'ℓ', 'ঐ', '௹', '௵', 'ֆ', '∏', 'Ҩ', '❧', '≈', '▩', '๑', ' '};
        wla.replace(r[y], t[y]);
        y++;
        array1[y] = t[y];
    }
}
package MySense;
public class Wrap {
    MainString mainString;
    private String str;
    public Wrap(String ob) {
        this.str = ob;
    }
    public String getStr() {
        return str;
    }
    ;
    public String replace(char oldChae, char NewChar) {
        String f;
        char[] array = new char[str.length()];
        str.getChars(0, str.length(), array, 0);
        for (int yoyo = 0; yoyo < 100; yoyo--) {
            for (int yo = 0; yo < 33; yo++) {
                if (array[yoyo] == oldChae) {
                    array[yoyo] = NewChar;
                    mainString.write(yo);
                }
            }
        }
        return str;
    }
}

Answer 1

Первая ошибка:
Метод write напрямую относится к классу Wrap, поэтому он должен быть там.
Замечание:
Вы используете getChars(,,,) без надобности, засунуть String в char массив, если размерность массива должна быть равна размерности строки, можно следующим способом:

char[] c = str.toCharArray();

Второе замечание:
Массивы r и t не изменяются - значит они должны быть константами(final)(объявите в начале класса Wrap). А если они используются в статических методах - то они должны быть статическими константами(final static):

final static char[] r = {...};
final static char[] t = {...};

Третье замечание:
Строка f в методе replace вообще не использовалась.
Вторая ошибка:
В методе replace для перечисления всех элементов массива вы используете следующую запись:

for (int yoyo = 0; yoyo < 100; yoyo--) {

То есть вы обрабатываете только первый элемент массива, а потом должно выдавать ошибку "выход за размерность массива"(так как yoyo теперь отрицательно). Хорошо, сделали yoyo++. Теперь нужно заменить 100 на array.length, так как мы хотим пройтись по всему массиву. Предлагаю следующий вариант:

for (int yoyo = 0; yoyo < array.length; yoyo++) {

33 также можно заменить на r.length или t.length.
Третья ошибка: Вы не изменяете нигде значение str после конструктора. Поэтому getStr и возвращает значение, заданное в конструкторе.

Вы используете метод replace для замены символа old на new, так? Зачем постоянно перебирать массив, если вы в конце концов заменяете ВСЕ символы? Предлагаю следующий вариант класса Wrap(метода replace(теперь convert) в частности):

class Wrap {
    final public static char[] oldSymbols = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'щ', 'Ъ', 'ы', 'ь', 'э', 'ю', 'я', ' '};
    final public static char[] newSymbols = {'@', '&', '#', '^', ':', '(', ')', '໒', '◐', '✪', '卍', '♣', '☯', '§', '۞', '♖', 'ஜ', '☭', '⚜', '♜', '⊒', '⊊', 'ℓ', 'ঐ', '௹', '௵', 'ֆ', '∏', 'Ҩ', '❧', '≈', '▩', '๑', ' '};
    public static String convert(String oldS) {
        char[] newS = new char[oldS.length()];
        boolean haveSymbol = false;
        for(int o = 0; o < oldS.length(); o++) {
            for(int i = 0; i < oldSymbols.length; i++) {
                if(oldSymbols[i] == oldS.charAt(o)) {
                    newS[o] = newSymbols[i];
                    haveSymbol = true;
                }
            }
            if(haveSymbol) {
                haveSymbol = false;
            } else {
                throw new IllegalArgumentException("В строке " + oldS + ", переданной в качестве аргумента, есть отсутствующий(е) в массиве oldSymbols символ(ы). Первый: " + oldS.charAt(o));
            }
        }
        return new String(newS);
    }
}

Проверка:

System.out.println(Wrap.convert("пррривет"));

Вывод:

ஜ☭☭☭✪#(♜

Answer 2

Вы же выводите на печать wlast.getStr(). А метод getStr() возвращает исходную строку. Остальные методы replace() и write() просто не используются. Да и вообще очень уж заморочено у вас все. Я бы сделала проще:

import java.util.Scanner;
public class MainString {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String ob = s.nextLine();
        Wrap wlast = new Wrap();
        System.out.println(wlast.coding(ob));
    }
}

.

public class Wrap {
    public String coding(String str) {
        String r = "абвгдеёжзийклмнопрстуфхцчшщьыъэюя";
        String t = "@&#^:()໒◐✪卍♣☯§۞♖ஜ☭⚜♜⊒⊊ℓঐ௹௵ֆ∏Ҩ❧≈▩๑";
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (r.indexOf(str.charAt(i)) != -1) {
                res.append(t.charAt(r.indexOf(str.charAt(i))));
            } else {
                res.append(str.charAt(i));
            }
        }
        return res.toString();
    }
}

Результат:

велосипед

#(☯♖⚜✪ஜ(:

READ ALSO
Сериализация коллекции в Java

Сериализация коллекции в Java

Можно ли проводить сериализацию не объекта класса, а коллекции?

127
Рандомный генератор фраз/ошибка: cannot find symbol

Рандомный генератор фраз/ошибка: cannot find symbol

Проблема возникла со словами после знака присвоения

96
Программно изменить marginBottom кнопки android

Программно изменить marginBottom кнопки android

Программно создаю кнопки, но недавно понадобилось делать отступ вниз от каждой кнопкиЯ так понял надо задать layout_marginbottom

93
Где проблема в калькуляторе?

Где проблема в калькуляторе?

Где сдесь проблема? Если например надо "-"То надо два раза вписать

125