Только начал изучать принципы "ООП".
Хотел сделать программу, которая считывает символы, переводит их в смайликовый формат.
Столкнулся с проблемой не понимания.
Что именно мне не понятно:
Мне не ясно почему, вызывая метод "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;
}
}
Первая ошибка:
Метод 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("пррривет"));
Вывод:
ஜ☭☭☭✪#(♜
Вы же выводите на печать 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();
}
}
Результат:
велосипед
#(☯♖⚜✪ஜ(:
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Проблема возникла со словами после знака присвоения
Программно создаю кнопки, но недавно понадобилось делать отступ вниз от каждой кнопкиЯ так понял надо задать layout_marginbottom