sLine = sLine.replaceAll("&&", "&");
sLine = sLine.replaceAll(((char)245)+"", "ő");
sLine = sLine.replaceAll(((char)213)+"", "Ő");
sLine = sLine.replaceAll(((char)361)+"", "ű");
sLine = sLine.replaceAll(((char)251)+"", "ű");
有没有办法只通过这一行?这在大字符串上非常慢。
答案 0 :(得分:5)
考虑将字符串转换为char[]
,然后手动迭代数组。
避免使用((char)245)+""
之类的字符串连接。使用字符常量。
但看起来您正在尝试手动修复字符串的编码?这是非常糟糕的主意。因为下周,您将拥有ü
字符的用户。然后,有人将使用€
货币值。然后,西班牙语用户将希望使用¿
字符。您愿意添加多少replaceAll
?!
了解如何编码/解码/重新编码字符串。
也许使用以下构造函数:
String(byte[] bytes, Charset charset)
并查看Java Charset类:
答案 1 :(得分:1)
您可以使用预编译的正则表达式来提高性能。在引擎盖下String.replaceAll
将编译并为你应用正则表达式。由于正则表达式的编译是相对计算密集型的,因此在频繁执行此代码时,这应该可以提高性能。
private static final Pattern PATTERN_1 = Pattern.compile("\u00f5");
private static final Pattern PATTERN_2 = Pattern.compile(Character.toString((char) 241));
String original = new String("A" + (char) 245 + "\u00f1" + "D");
String replaced2 = PATTERN_1.matcher(original).replaceAll("B");
replaced2 = PATTERN_2.matcher(replaced2).replaceAll("C");
System.out.println(original + " -> " + replaced2);
将打印出来:
A ?? D - > ABCD
使用非常长的String
时,这可能不会提供超出您建议的性能。
暂且不谈: 在代码中使用非UTF-8字符会导致您(和您的同事)痛苦不堪。您应该始终使用Unicode characters或者字符十进制表示。
答案 2 :(得分:0)
private static final String char1 = Character.toString((char) 245);
private static final String char2 = Character.toString((char) 213);
private static final String char3 = Character.toString((char) 361);
private static final String char4 = Character.toString((char) 251);
private static final Pattern PATTERN_1 = Pattern.compile(char1);
private static final Pattern PATTERN_2 = Pattern.compile(char2);
private static final Pattern PATTERN_3 = Pattern.compile(char3);
private static final Pattern PATTERN_4 = Pattern.compile(char4);
public static String replaceAccents(String sLine) {
String replaced=sLine;
if (replaced.contains(char1)) replaced = PATTERN_1.matcher(replaced).replaceAll("ő");
if (replaced.contains(char2)) replaced = PATTERN_2.matcher(replaced).replaceAll("Ő");
if (replaced.contains(char3)) replaced = PATTERN_3.matcher(replaced).replaceAll("Ű");
if (replaced.contains(char4)) replaced = PATTERN_4.matcher(replaced).replaceAll("ű");
return replaced;
}
感谢Sean。这是最终的快速代码。