Я удивлен, что никто не упомянул об этом, но если мы сортируем телефонную книгу, нам, скорее всего, не нужна чистая сортировка ASCII.
Действительно ли Bob DeCarlo
принадлежит раньше Ralph Dearborn
? Если вы сортируете с помощью cmp
, то в результатах сначала появляется мистер ДеКарло.
Даже если вы нормализуетесь для случая, у вас все еще есть проблемы. Существует множество сложностей с сортировкой и хранением вещей. Различные организации имеют правила для обработки этих проблем.
Поскольку сортировка является дорогостоящей операцией, вам нужно, чтобы каждое сравнение работало как можно быстрее. Способ сделать это - использовать самый простой код для всех ваших сравнений. Поскольку cmp
сам по себе не даст желаемого результата, нам нужно сгенерировать и кэшировать нормализованный термин сортировки для каждого элемента в телефонной книге.
Итак, если вы уже получили данные телефонной книги в массиве:
sub extract_and_normalize {
# Do stuff here to embody your alphabetization rules.
return [ $normed, $line ];
}
# Generate your sort terms
my @processed = map extract_and_normalize($_), @lines;
# Sort by the normalized values
my @sorted = sort {$a->[0] cmp $b->[0]}, @processed;
# Extract the lines from the sorted set.
@lines = map $_->[1], @sorted;
Или используйте преобразование Шварца, как предлагает hobbs
, чтобы избежать создания всех промежуточных переменных:
@lines = map $_->[1],
sort { $a->[0] cmp $b->[0] }
map extract_and_normalize($_), @lines;