2017-01-04 9 views
0

1000行のファイルが解析されています。Trim()vs IndexOf()

行がいくつかのキーワードで始まるかどうかを確認する必要があります。

私には2つのオプションがあります。

オプション1:

String[] keywordsArr = { "Everything", "Think", "Result", "What", "#Shop", "#Cure" }; 
    for (int i = 0; i < linesOfCode.length; i++) { 

     for (String keyWord : keywordsEndingAtEndOfLogicalLine) { 

      if (linesOfCode[i].indexOf(keyWord) > -1) { 

       if (linesOfCode[i].trim().startsWith(keyWord)) { 

        linesOfCode[i] = ""; 
        break; 
       } 
      } 
     } 
    } 

オプション2:キーワードで始まる行の

String[] keywordsArr = { "Everything", "Think", "Result", "What", "#Shop", "#Cure" }; 
    for (int i = 0; i < linesOfCode.length; i++) { 

     for (String keyWord : keywordsArr) { 

      if (linesOfCode[i].trim().startsWith(keyWord)) { 

        linesOfCode[i] = ""; 
        break; 
      } 
     } 
    } 

周波数100

+1

のように、より高速のために、あなたはあなたの正規表現をコンパイルする必要があります1つの一致が見つかっても内部ループが壊れます – Prabu

答えて

-1

中1は、ブレークするのではなく、継続使用してみてくださいされています。ループを停止するのではなく、continueを実行するとプログラムが1レベル上に移動し、次の項目のループが継続されます。

+0

'linesOfCode [i] =" "'を実行すると、より多くのキーワードを試しても意味をなさないので、 'break'は非常に適切です。 – rici

0

文字列の先頭でキーワードを探すのを避けるため、文字列全体をキーワードとしてスキャンする点はほとんどありません。その考えが高価なtrimを避けることだったなら、より安価な手法を使って行の最初のトークンを見つけることは合理的かもしれません。

startsWithの比較では、接頭辞がキーワードである行で始まる行について誤った結果が生じる可能性があることに注意してください。キーワードは、breakた場合、例えば、のようなコードの行:

breakfast = "ham and eggs"; 

が誤って除去されます。

StringTokenizerを使用して調べると、文字列の最初の単語を抽出したり、正規表現を使用したりすることができます。

0

これは正規表現が本当に良いものです。あなたのコードは、

for (int i = 0; i < linesOfCode.length; ++i) { 
    linesOfCode[i] = linesOfCode.replaceAll(
     "^\\s+(Everything|Think|Result|what|#Shop,#Cure).*", ""); 
} 

と同等ですが、キーワードの後に​​単語の境界(\\b)が必要な場合があります。あなたが原因となりますよう、あなたがブレークを使用すべきではないキーワード配列に存在するすべての単語を削除したい場合は、2番目のアプローチはit.Butを行うのがよりクリーンな方法だ

private static final Pattern PATTERN = Pattern.compile(
    ^\\s+(Everything|Think|Result|what|#Shop,#Cure)\\b"); 

for (int i = 0; i < linesOfCode.length; ++i) { 
    if (Pattern.matcher(linesOfCode[i]).matches()) { 
     linesOfCode[i] = ""; 
    } 
}