Замена букв в слове на цифры

553
19 марта 2017, 03:51

Нужно заменить буквы в слове на цифры. Одна цифра может хранить в себе до 4 букв. Почему строка не меняется?

centerBut.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Scanner scan = new Scanner(System.in);
        String fn = JOptionPane.showInputDialog("Введите имя: ");
        String fw1 = scan.next();
        fn.replace('а', '1');
        fn.replace('и', '1');
        fn.replace('с', '1');
        fn.replace('ъ', '1');
        fn.replace('б', '2');
        fn.replace('й', '2');
        fn.replace('т', '2');
        fn.replace('ы', '2');
        fn.replace('в', '3');
        fn.replace('к', '3');
        fn.replace('у', '3');
        fn.replace('ь', '3');
        fn.replace('г', '4');
        fn.replace('л', '4');
        fn.replace('ф', '4');
        fn.replace('э', '4');
        fn.replace('д', '5');
        fn.replace('м', '5');
        fn.replace('х', '5');
        fn.replace('ю', '5');
        fn.replace('е', '6');
        fn.replace('н', '6');
        fn.replace('ц', '6');
        fn.replace('я', '6');
        fn.replace('ё', '7');
        fn.replace('о', '7');
        fn.replace('ч', '7');
        fn.replace('ж', '8');
        fn.replace('п', '8');
        fn.replace('ш', '8');
        fn.replace('з', '9');
        fn.replace('р', '9');
        fn.replace('щ', '9');
        JOptionPane.showMessageDialog(null, "Ваши числа " + fn, "window", JOptionPane.PLAIN_MESSAGE);
    }
});
Answer 1

Метод replace не меняет исходную строку, а возвращает новую строку. Соответственно, во всех строках кода должно быть так:

fn = fn.replace(...);

Однако создавать при каждой замене новую строку - не лучший подход. Можно проходить по всем символам строки, вычислять замещающий символ и добавлять его в StringBuilder, после чего создавать строку из StringBuilder.

Также 33 строки кода на замену - это много дублируемого кода. Стоит попытаться объединить символы в группы с заданными правилами замены. Например, так:

private static char replaceChar(char c)
{
    int resultCharCode = c;
    if (c >= 1072 && c <= 1077)
    {
        resultCharCode = c - 1023;
    }
    else if (c >= 1078 && c <= 1103)
    {
        resultCharCode = (c - 1071) % 9 + 49;
    }
    else if (c == 1105)
    {
        resultCharCode = c - 1050;
    }
    return (char)resultCharCode;
}

И, в итоге, использование:

String str = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray())
{
    char replacedChar = replaceChar(c);
    sb.append(replacedChar);
}
String result = sb.toString();

Вывод на экран str и result такой:

абвгдеёжзийклмнопрстуфхцчшщъыьэюя
123456789123456789123456789123456
READ ALSO
Перенос функциональности из Activity во Fragment

Перенос функциональности из Activity во Fragment

Проблема собственно следующая: я реализовал в своём приложении смену языков по нажатию на кнопки в Activity (всё работает корректно), но я решил...

462
Атомарное перемещение файла. StandartCopyOption.ATOMIC_MOVE

Атомарное перемещение файла. StandartCopyOption.ATOMIC_MOVE

Кто расскажет подробно, что делает данная опция ? Что означает атомарное перемещение ? Я никак не могу найти её объяснения

323
Как лучше разметить?

Как лучше разметить?

Как лучше разметить данную структуру по бэм? Все оставить как есть или лучше разбить по блокам вложенные элементы

277