-1
      sLine = sLine.replaceAll("&&", "&"); 
      sLine = sLine.replaceAll(((char)245)+"", "ő");
      sLine = sLine.replaceAll(((char)213)+"", "Ő");
      sLine = sLine.replaceAll(((char)361)+"", "ű");
      sLine = sLine.replaceAll(((char)251)+"", "ű");

有没有办法做到这一点?这在大弦上非常慢。

4

3 回答 3

5
于 2012-12-23T12:56:25.497 回答
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 字符或字符十进制表示。

于 2012-12-23T13:22:48.123 回答
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,这是最终的快速代码。

于 2012-12-23T14:25:17.393 回答