Вы должны думать об этом как о проблеме токенизации, поэтому SW1A 1AA должен токенизироваться на:
(хотя вы можете разбить внутреннюю часть на 1 и АА, если хотите)
и G12 8QT должны токенизироваться на:
Как только вы разбили почтовый индекс на эти составные части, сортировка должна быть достаточно простой. Исключение составляет почтовый индекс GIR 0AA, но вы можете просто жестко закодировать тест для этого
edit: еще несколько мыслей о токенизации
Для примера почтового индекса SW1A 1AA, SW - это область почтового индекса, 1A - это район почтового индекса (который будет разбит на две части для сортировки), 1 - сектор почтового индекса, а AA - почтовый индекс единицы.
Это действительные форматы почтовых индексов (источник: руководство пользователя Royal Mail PAF, стр. 8 - ссылка внизу этой страницы ):
АН НАА
ААН НАА
ANN NAA
АНА НАА
AAA NAA (только для кода GIR 0AA)
АНН НАА
ААНА НАА
Таким образом, будет грубый алгоритм (при условии, что мы хотим разделить почтовый индекс сектора и единицы):
- код = GIR 0AA? Токенизируйте в GI / R / / 0 / AA (рассматривая R как район, упрощающий вещи)
- код 5 букв длиной, например, G1 3AF? Токенизировать в G / 1 / / 3 / AF
- код из 6 букв, 3-й символ - например, буква W1P 1HQ? Токенизируйте в W / 1 / P / 1 / HQ
- код из 6 букв, 2-й символ - например, буква CR2 6XH? Токенизируйте в CR / 2 / / 6 / XH
- код из 7 букв, 4-й символ, например, буква. EC1A 1BB? Токенизировать в EC / 1 / A / 1 / BB
- в противном случае, например TW14 2ZZ, токенизация в TW / 14 / / 2 / ZZ
Если цель состоит в том, чтобы отобразить список почтовых индексов для выбора пользователя, я бы принял предложение Нила Баттерворта о сохранении «сортируемой» версии почтового индекса в базе данных. Самый простой способ создать сортируемую версию - это добавить все записи до девяти символов:
- два символа для области (правая клавиша, если короче)
- два для номера района (левый край, если короче)
- один для окружного письма (прокладка, если отсутствует)
- пространство
- один для сектора
- два за единицу
и 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
Вам нужно заполнить область правой кнопкой, если она слишком короткая: заполнение влево дает неправильный порядок сортировки. Все однобуквенные области - B, E, G, L, M, N, S, W - будут отсортированы перед всеми двухбуквенными областями - AB, AL, ..., ZE - если вы добавите их слева
Номер района должен быть дополнен слева, чтобы гарантировать, что естественный порядок W1, W2, ..., W9, W10 остается неизменным