Java最快的方式来改变字符

时间:2012-12-23 12:53:32

标签: java android

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

有没有办法只通过这一行?这在大字符串上非常慢。

3 个答案:

答案 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。这是最终的快速代码。