Преобразование букв в алфавитную позицию с двумя JLists - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь заменить все слова (буквы алфавита) из JList1 на число, соответствующее его месту в алфавите JList2 нажатием кнопки Run. (от A до 01). И если это не буква английского алфавита, оставьте ее как есть. Прописная буква не имеет значения (a и A по-прежнему 01) и пробелы должны быть сохранены.

Для визуальных целей:

https://i.stack.imgur.com/PYhYA.png

"Apple!" следует преобразовать в «0116161205!»
"Переполнение стека" до "1920010311 1522051806121523"
от über до ü020518

Я попробовал несколько методов, которые нашел здесь, но не имел понятия, как добавить дополнительные 0 перед первыми 9 буквами или оставить пробелы. Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Так дано ...

(от A до 01) И если это не буква английского алфавита, оставьте ее как есть. Прописная буква не имеет значения (a и A по-прежнему 01), и пробелы должны быть сохранены.

Это поднимает некоторые интересные моменты:

  • Нам нет дела до неанглийских символов, поэтому мы можем обойтись без проблем, связанных с кодировкой UTF
  • Капитализация не имеет значения
  • Пробелы должны быть сохранены

Причина, по которой эти пункты интересны для меня, заключается в том, что нас интересует только небольшое подмножество символов (1-26). Это сразу кричит мне "ASCII"!

Это обеспечивает непосредственную справочную таблицу, которая не требует, чтобы мы производили что-либо заранее, она немедленно доступна.

Быстрый просмотр любой таблицы ascii предоставляет нам всю необходимую информацию. A-Z находится в диапазоне 65-90 (поскольку нас не волнует регистр, нам не нужно беспокоиться о нижнем регистре.

Но как это нам поможет?

Что ж, теперь это означает, что основным вопросом становится «Как нам преобразовать char в int, что удивительно просто! char может быть одновременно "символом" и "числом" из-за поддержки кодировки ASCII!

Так что, если вы распечатаете (int)'A', вы получите 65! И поскольку все символы в порядке, нам просто нужно вычесть 64 из 65, чтобы получить 1!

Вот в принципе вся ваша проблема решена прямо здесь!

О, хорошо, вам нужно разобраться с крайними случаями символов, не попадающими между A-Z, но это просто простое утверждение if

Решение, основанное на вышеупомянутой «мощи», может выглядеть примерно так ...

public static String convert(String text) {
    int offset = 64;
    StringBuilder sb = new StringBuilder(32);
    for (char c : text.toCharArray()) {
        char input = Character.toUpperCase(c);
        int value = ((int) input) - offset;
        if (value < 1 || value > 25) {
            sb.append(c);
        } else {
            sb.append(String.format("%02d", value));
        }
    }
    return sb.toString();
}

Теперь, есть несколько способов, которыми вы могли бы подойти к этому, я выбрал путь, основанный на моем понимании проблемы и моем опыте.

И на основе вашего примера ввода ...

String[] test = {"Apple!", "stack Overflow", "über"};
for (String value : test) {
    System.out.println(value + " = " + convert(value));
}

выдаст следующий вывод ...

Apple! = 0116161205!
stack Overflow = 1920010311 1522051806121523
über = ü020518
0 голосов
/ 09 мая 2018

Вот решение:

//Create a Map of character and equivalent number
Map<Character, String> lettersToNumber = new HashMap<>();
int i = 1;
for(char c = 'a'; c <= 'z'; c++) {
    lettersToNumber.put(c, String.format("%02d", i++));
}

//Loop over the characters of your input and the corresponding number
String result = "";
for(char c : "Apple!".toCharArray()) {
    char x = Character.toLowerCase(c);
    result+= lettersToNumber.containsKey(x) ? lettersToNumber.get(x) : c;
}

Вход, Выход

Apple!           => 0116161205!
stack Overflow   => 1920010311 1522051806121523
über             => ü020518
...