2

このコードを実装する最速の方法は何かを判断しようとしています:

Pattern ID_REGEX = Pattern.compile( "[A-Za-z0-9_\\-.]+" );
boolean match = ID_REGEX.matcher( id ).matches();
if ( !match ) throw new IllegalArgumentException("Disallowed character in ID");

ID_REGEX が定数であることを考えると、BitSet や許可された値の配列のようなものが、これを実装する最速の方法であると思います。

Character.isLetterではなく、A-Za-z を検索することに注意してください。

OSS 実装に対する追加の称賛

4

2 に答える 2

3

私の速いが不明確な解決策

// encapsulate this into a class and do once; perhaps use a static initializer
boolean[] allowed = new boolean[256]; // default false
allowed[32] = true;
allowed['a'] = true;
// fill all allowed characters
allowed['Z'] = true;

// the check
for (int n=0,len=str.length(); n<len; n++) {
  char ch = str.charAt(n);
  if (ch>255 || !allowed[ch]) {
    return false;
  }
}
return true;

追加のキャストが必要になる場合がありますが、アイデアが明確であることを願っています。

于 2013-10-15T17:36:37.500 に答える
0

文字列を反復処理し、文字コードを取得し、ASCII テーブル コードと比較できると思います。このようにして、各文字で 3 つbetweenの比較 (az、AZ、0-9 の場合) と、他の文字の 6 つの通常の整数比較があります。最速になると思います。基本的に同じことを行うマルチスレッドアプローチを試すこともできますが、開始する前に問題をいくつかの部分に分割し、同時にチェックを行います。
編集 (@krosenvold コメントの後): スレッドの作成には独自の代償があるため、マルチスレッド アプローチは非常に大きな文字列にのみ適しています。

于 2013-10-15T17:10:27.917 に答える