ワイルドなワイルドカード処理
週末、仕事上の知人と酒を飲みました。プログラマの鉄板ネタとして「最近見たヒドいコード」という話題がありますが、そういえばとそこで話したネタをここにも書いておきます。
よくある社内業務のWebアプリを思い浮かべてください。自分が処理する事案を検索するために、例えば案件番号を入力できるとしましょう。そして、案件番号にはワイルドカードが使えるとします。例えば、「ABC*」と入力すると「ABCA90」と「ABCD70」が表示されるけど、「ABEF30」は表示されないとか、そういう奴です。よくありますよね。
で、この画面がすごく遅い。別段他に難しい処理をしているわけではなく、ワイルドカードを指定すると遅い。ちゃんとワイルドカード処理をすると結構大変なので、前方一致だけ(つまり、案件番号の先頭が何かということしかワイルドカードで指定できない)でいいよという話だったんですが、もしかしていろいろとやっちゃってるんでしょうか。
担当者に聞いてみると、「いや、タンバリンさん、いろいろとか無理です。前方一致で精一杯」という回答。えー?
前方一致の処理は単純です。入力された文字列をS1、比較対象の文字列をS2とすると
- S1の末端から「*」を取り除く
- S1の1文字目とS2の1文字目を比較する
- S2の2文字目とS3の2文字目を比較する。これをS1の最後の文字まで繰り返す
JavaだとstartsWith()というようなメソッドがありますから、1文字ずつ比較する必要すらないです。んー、何がそんなに難しいのか。
というわけで、コードの中を見てびっくり。こんな処理になっていました。
- 文字列の集合SGを用意する
- SGに「*」を加える
- S2の1文字目と「*」を連結してできた文字列をSGに加える
- S2の1文字目と2文字目と「*」を連結してできた文字列をSGに加える。これをS2の最後の文字まで繰り返す
- S1がSGに含まれるかチェックする
斬新です。そしてワイルドです。そして確かに前方一致だけじゃなかったらすごく難しそう。「『ABCDE』にマッチするワイルドカードの集合」を取得する・・・?えーっと、そもそも、その集合って有限かな。「*」が連続してはいけないというルールがあれば、有限になるか。うーん・・・
「日記・コラム・つぶやき」カテゴリの記事
- 沖縄の美ら海水族館に行ってきた。そのはち(2025.01.02)
- 沖縄の美ら海水族館に行ってきた。そのなな(2025.01.01)
- 沖縄の美ら海水族館に行ってきた。そのろく(2025.01.01)
- 沖縄の美ら海水族館に行ってきた。そのご(2024.12.31)
- 沖縄の美ら海水族館に行ってきた。そのよん(2024.12.14)
Comments