Есть разные способы ответить на этот вопрос.Возможно, самый простой способ - это найти ответы на каждую из проблем в отдельности:
Задача 1:
eg1 Я хочу отобразить строку с "A" длябуквенные символы, «N» для числовых символов, «B» для пробелов и «X» для чего-либо еще.Таким образом, «SL5 3QW» становится «AANBNAA».
Простое решение:
public static String map(final String input){
final char[] out = new char[input.length()];
for(int i = 0; i < input.length(); i++){
final char c = input.charAt(i);
final char t;
if(Character.isDigit(c)){
t = 'N';
} else if(Character.isWhitespace(c)){
t = 'B';
} else if(Character.isLetter(c)){
t = 'A';
} else{
t = 'X';
}
out[i] = t;
}
return new String(out);
}
Тест:
public static void main(final String[] args){
System.out.println(map("SL5 3QW"));
}
Выход:
AANBNAA
Задача 2:
eg2.Я хочу перевести некоторые символы, такие как «œ» (x'9D ') в «oe» (x'6F65'), «ß» в «ss», «å» в «a» и т. Д.
Решение:
Это стандартная функциональность, для этого следует использовать API нормализатора.См. эти предыдущие ответы для справки.
Общая картина
Но, если подумать, существует, конечно, более общее решениетвоя проблема.Давайте посмотрим, сколько отрицательных голосов я получу за это любителями if / else.Определите интерфейс преобразователя, который принимает определенные символы и / или классы символов и сопоставляет их с другими символами:
public interface CharTransformer{
boolean supports(char input);
char transform(char input);
}
А теперь определите метод, который можно вызывать с помощью строки и набора таких преобразователей.Для каждого отдельного символа каждый преобразователь будет запрошен, чтобы видеть, поддерживает ли он этот символ.Если он это сделает, пусть он сделает трансформацию.Если для персонажа не найден Трансформер, выведите исключение.
public static String mapWithTransformers(final String input,
final Collection<? extends CharTransformer> transformers){
final char[] out = new char[input.length()];
for(int i = 0; i < input.length(); i++){
final char c = input.charAt(i);
char t = 0;
boolean matched = false;
for(final CharTransformer tr : transformers){
if(tr.supports(c)){
matched = true;
t = tr.transform(c);
break;
}
}
if(!matched){
throw new IllegalArgumentException("Found no Transformer for char: "
+ c);
}
out[i] = t;
}
return new String(out);
}
Еще одна вещь: Карты
Примечание: Другие предложили использовать Карту.Хотя я не думаю, что стандартная карта подходит для этой задачи, вы можете использовать MapMaker.makeComputingMap (функция) в Guava для вычисления замен по мере необходимости (и автоматического их кэширования).Таким образом, у вас будет лениво инициализированная карта кэширования.