2012-10-11 15 views
13

文字列に英数字のみが含まれていることを確認する最速の方法は何ですか?文字列をチェックする最速の方法は、Javaの英数字です

多くのCPUを噛んでしまうコードがあります。事前コンパイル済みの正規表現を使用するよりも早い方法があるのだろうかと思います。

更新日:多くの投票がありますので、気をつけてください。 Stackoverflowは、どのアルゴリズムがタスクを達成するために使用するかを議論するのに使用すべきではないでしょうか?

+1

私たちはあなたに私たちに表示されない何かより速くコードを書く方法を教えてくれません... –

+1

時期尚早な最適化?基準?プロファイリング? –

+1

@StephenC表示するコードはありません。_best_方法が何であるかを尋ねています。 – Jacob

答えて

16

「正しい」答えを検証するテストを書いています。興味深いことに、正規表現を使用すると、手作業で文字列を繰り返し処理するよりも約5〜10倍遅くなることが分かりました。さらに、isAlphanumeric2()の機能は、わずかにisAlphanumeric()よりも高速です。

public class QuickTest extends TestCase { 

    private final int reps = 1000000; 

    public void testRegexp() { 
     for(int i = 0; i < reps; i++) 
      ("ab4r3rgf"+i).matches("[a-zA-Z0-9]"); 
    } 

public void testIsAlphanumeric() { 
    for(int i = 0; i < reps; i++) 
     isAlphanumeric("ab4r3rgf"+i); 
} 

public void testIsAlphanumeric2() { 
    for(int i = 0; i < reps; i++) 
     isAlphanumeric2("ab4r3rgf"+i); 
} 

    public boolean isAlphanumeric(String str) { 
     for (int i=0; i<str.length(); i++) { 
      char c = str.charAt(i); 
      if (!Character.isDigit(c) && !Character.isLetter(c)) 
       return false; 
     } 

     return true; 
    } 

    public boolean isAlphanumeric2(String str) { 
     for (int i=0; i<str.length(); i++) { 
      char c = str.charAt(i); 
      if (c < 0x30 || (c >= 0x3a && c <= 0x40) || (c > 0x5a && c <= 0x60) || c > 0x7a) 
       return false; 
     } 
     return true; 
    } 

} 
24

ように使用String.matches()、絶対 "最速" の可能なアプローチではないかもしれない

String myString = "qwerty123456"; 
System.out.println(myString.matches("[A-Za-z0-9]+")); 

。しかし、一般的に言えば、パフォーマンス面で言語の「標準ライブラリ」を書く人々と競争しようとすることにはあまり意味がありません。

+0

はい。 C#には標準的な機能があります。 Javaはそうではないようだ。 – Jacob

2

範囲:[0-9a-zA-Z]を指定するため、正規表現はおそらく非常に効率的です。正規表現の実装コードが効率的であると仮定すると、これは単純に各範囲の上限と下限の比較を必要とします。ここでコンパイルした正規表現が何をすべきか、基本的です:

boolean isAlphanumeric(String str) { 
    for (int i=0; i<str.length(); i++) { 
     char c = str.charAt(i); 
     if (c < 0x30 || (c >= 0x3a && c <= 0x40) || (c > 0x5a && c <= 0x60) || c > 0x7a) 
      return false; 
    } 

    return true; 
} 

すべての文字をチェックする必要がありますので、私は、あなたのコードは、このよりも効率的である可能性がどのように表示されていない、との比較は本当にすべて簡単にできませんでした。

+1

これと 'String.matches()'の間にある可能性があります。私は誰かが前にそれをやり遂げたことを望んでいた。私自身がテストを書く必要があるように見えます(: – Jacob