2014-02-27 71 views
-1

我的问题是,我有一个大字符串,我想把所有的“我”改成“我”。但是我无法有效地做到这一点。我知道以前有关于替换字符串部分的问题,但我不确定什么是最快的方法。效率 - 替换句子中间的词

某种类型的我曾尝试:

一)

if (question.charAt(i)=='i' && question.charAt(i+1)==' ') 
{ 
    question = question.substring(0,i) + 'I' + question.substring(i+1); 
} 

B)(100-200x慢于尝试)

question = question.replace("i ", "I "); 

C)(大约比尝试a慢100倍x)

question = question.replaceAll("i ", "I "); 

我从来没有做过很多高效的编程,这些都不能削减它的效率,我需要这样做。有没有更快的方式,我不知道?

+0

通常,对于中等长度,扫描的成本的一个字符串,使用任何机构,将由成本分手(二者,并且更重要的是,“隐藏”在GC周期测量)淹没并重新构造String对象。 –

+0

请注意,上面的示例将苹果与桔子进行比较,因为第一种情况不会扫描以找到要替换的位置。 –

+0

我希望你注意加热JVM,并在像这样的微基准标记时将平均值作为大量运行。 Microbenchmarks是非常难以得到正确的。 –

回答

1

一个应该比你更高效的解决方案(它已经非常有效)如下。

public String convertWord(String word) 
{ 
    StringBuilder sb = new StringBuilder(); 

    char[] charArr = word.toCharArray(); 

    for(int i = 0; i < charArr.length; i++) 
    { 
     // Single character case 
     if(charArr[i] == 'i' && (i+1 < charArr.length) && charArr[i+1] = ' ') 
     { 
      sb.append('I'); 
     } 
     else 
     { 
      sb.append(word.charAt(i)); 
     } 
    } 

    return sb.toString(); 
} 
+1

重新阅读答案后:'i ++'匹配时,因为您明确知道下一个字符是'''' – Elfentech