これをトークン化の問題と考える必要があるため、SW1A 1AA は次のようにトークン化する必要があります。
(必要に応じて、内側の部分を 1 と AA に分割できますが)
G12 8QT は次のようにトークン化する必要があります。
郵便番号をこれらの構成要素に分解したら、並べ替えは簡単です。GIR 0AA 郵便番号には例外がありますが、そのテストをハードコードすることができます
編集:トークン化に関するいくつかの考え
サンプルの郵便番号 SW1A 1AA の場合、SW は郵便番号の地域、1A は郵便番号の地区 (並べ替えのために 2 つの部分に分けます)、1 は郵便番号のセクター、AA は郵便番号の単位です。
これらは有効な郵便番号形式です (出典: Royal Mail PAF ユーザー ガイド ページ 8 -このページの下部にあるリンク):
AN NAA
AAN NAA
ANN NAA
ANA NAA
AAA NAA (GIR 0AA コードのみ)
AANN NAA
AANA NAA
大まかなアルゴリズムは次のようになります (セクターとユニットの郵便番号を分離したい場合):
- コード = GIR 0AA? GI/R/ /0/AA にトークン化します (R を地区として扱うと簡単になります)
- コード 5 文字の長さ、例: G1 3AF? G/1/ /3/AF にトークン化
- コードは 6 文字の長さで、3 番目の文字は文字です。例: W1P 1HQ? W/1/P/1/HQ にトークン化
- CR2 6XH? CR/2/ /6/XH にトークン化
- EC1A 1BB のように、4 番目の文字が文字である 7 文字の長さのコード EC/1/A/1/BB にトークン化
- それ以外の場合、例: TW14 2ZZ、TW/14/ /2/ZZ にトークン化
ユーザーが選択できるように郵便番号のリストを表示することが目的である場合、データベースに郵便番号の「ソート可能な」バージョンを保存するという Neil Butterworth の提案を採用します。ソート可能なバージョンを作成する最も簡単な方法は、すべてのエントリを 9 文字にパディングすることです。
- エリアの 2 文字 (短い場合は右パッド)
- 地区番号は 2 つ (短い場合は左パッド)
- 地区レター用の 1 つ (欠落している場合はパッド)
- スペース
- セクター用の 1 つ
- ユニットに2つ
また、GIR 0AA はわずかな例外です。スペースでパディングすると、ソート順は正しいはずです。# を使用してスペースを表す例:
- W1#1AA => W##1##1AA
- WC1#1AA => WC#1##1AA
- W10#1AA => W#10##1AA
- W1W#1AA => W##1W#1AA
- GIR#0AA => GI#R##0AA
- WC10#1AA => WC10##1AA
- WC1W#1AA => WC#1W#1AA
領域が短すぎる場合は、領域を右にパディングする必要があります。左にパディングすると、間違った並べ替え順序が生成されます。すべての 1 文字領域 (B、E、G、L、M、N、S、W) は、すべての 2 文字領域 (AB、AL、...、ZE) の前にソートされます。
自然な W1、W2、...、W9、W10 の順序が損なわれないように、地区番号をパディングしたままにする必要があります。