« 表現を圧しようとするものを、私は許さない | Main | ニンジャバットマンが大バカ映画で最高だった »

ワイルドなワイルドカード処理

週末、仕事上の知人と酒を飲みました。プログラマの鉄板ネタとして「最近見たヒドいコード」という話題がありますが、そういえばとそこで話したネタをここにも書いておきます。

よくある社内業務のWebアプリを思い浮かべてください。自分が処理する事案を検索するために、例えば案件番号を入力できるとしましょう。そして、案件番号にはワイルドカードが使えるとします。例えば、「ABC*」と入力すると「ABCA90」と「ABCD70」が表示されるけど、「ABEF30」は表示されないとか、そういう奴です。よくありますよね。

で、この画面がすごく遅い。別段他に難しい処理をしているわけではなく、ワイルドカードを指定すると遅い。ちゃんとワイルドカード処理をすると結構大変なので、前方一致だけ(つまり、案件番号の先頭が何かということしかワイルドカードで指定できない)でいいよという話だったんですが、もしかしていろいろとやっちゃってるんでしょうか。

担当者に聞いてみると、「いや、タンバリンさん、いろいろとか無理です。前方一致で精一杯」という回答。えー?

前方一致の処理は単純です。入力された文字列をS1、比較対象の文字列をS2とすると

  1. S1の末端から「*」を取り除く
  2. S1の1文字目とS2の1文字目を比較する
  3. S2の2文字目とS3の2文字目を比較する。これをS1の最後の文字まで繰り返す

JavaだとstartsWith()というようなメソッドがありますから、1文字ずつ比較する必要すらないです。んー、何がそんなに難しいのか。

というわけで、コードの中を見てびっくり。こんな処理になっていました。

  1. 文字列の集合SGを用意する
  2. SGに「*」を加える
  3. S2の1文字目と「*」を連結してできた文字列をSGに加える
  4. S2の1文字目と2文字目と「*」を連結してできた文字列をSGに加える。これをS2の最後の文字まで繰り返す
  5. S1がSGに含まれるかチェックする

斬新です。そしてワイルドです。そして確かに前方一致だけじゃなかったらすごく難しそう。「『ABCDE』にマッチするワイルドカードの集合」を取得する・・・?えーっと、そもそも、その集合って有限かな。「*」が連続してはいけないというルールがあれば、有限になるか。うーん・・・

驚きに満ちた職場からお伝えしました。現場からは以上です。

|
|

« 表現を圧しようとするものを、私は許さない | Main | ニンジャバットマンが大バカ映画で最高だった »

日記・コラム・つぶやき」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/47905/66892518

Listed below are links to weblogs that reference ワイルドなワイルドカード処理:

« 表現を圧しようとするものを、私は許さない | Main | ニンジャバットマンが大バカ映画で最高だった »