Так дано ...
(от 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