回答这个问题有不同的方法。最简单的方法可能是针对每个问题分别提出答案:
问题1:
例如:我想将字符串映射为"A",对于字母字符为"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:
例如2. 我想将一些字符进行翻译,例如将“œ”(x'9D')翻译为“oe”(x'6F65'),将“ß”翻译为“ss”,将“å”翻译为“a”等。
解决方案:
这是标准功能,您应该使用Normalizer 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);
}
还有一件事:地图
注意:其他人建议使用地图。虽然我认为标准地图不适合这个任务,但你可以使用Guava的MapMaker.makeComputingMap(function)根据需要计算替换(并自动缓存它们)。这样你就有了一个惰性初始化缓存映射。