Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Блог об AS3

Оценить эту запись

Сравнение строк в естественном порядке для Flash

Запись от Яски размещена 18.05.2009 в 17:45

http://code.google.com/p/as3natcompare/

Стандартная сортировка во флеш сортирует строки в алфавитном порядке и из-за этого может случиться проблема, что строки с числами будут сортироваться не в том порядке, в котором мы с вами привыкли, а по увеличению кодов символов цифр.
Например Flash отсортирует список так:
Цитата:
rfc1.txt
rfc2086.txt
rfc822.txt
Но было бы удобнее и привычнее, если бы программа сортировала строки в таком порядке:
Цитата:
rfc1.txt
rfc822.txt
rfc2086.txt
Такой порядок строк называется естественным порядком (natural order). В сети есть реализация этого алгоритма http://sourcefrog.net/projects/natsort для С и для Java. К сожалению для AS3 ничего найти не удалось. Поэтому я переписал сишный код на AS3.

Суть алгоритма в том, что в строках буквенная часть сравнивается лексически, а цифровая часть сравнивается по числовому значению. Например:
Цитата:
file1 < file2 < file10 < file23 < file2000
В исходном коде все пробелы игнорировались, я сделал немного подругому. Мне хотелось добиться, чтобы две строки признавались равными, только в случае, когда все символы двух строк совпадают. Так строки расставляются по увеличению числа пробелов. Например:
Код:
«file1» < «file 1» < «file   1»
Строки в которых есть цифры с предварительными нулями сравниваются особо. Нули игнорируются, но из двух строк «file1» и «file001» будет больше та строка, в которой меньше предварительных нулей, т.е. «file1».

Алгоритм не поддерживает многоязычность в общем случае. Работает только с языками, которые используют цифры и непечатные символы из ASCII таблицы. Кириллица и Латиница работают, проверено.

Дробные числа будут сравниваться не правильно, так «25,12» > «25,3» из-за наличия запятой, которая разделила каждую строку на два числа, по которым и идет сравнение.

Весь код содержится в двух методах и в двух файлах natCaseCompare и natCompare. Я сделал их глобальными функциями для того, чтобы можно было просто вызывать их из любого места в коде.
natCaseCompare отличается от natCompare тем, что в аргументах содержится третий параметр, который определяет будет ли метод учитывать регистр букв или нет. По умолчанию natCaseCompare не учитывает регистр, а natCompare учитывает. Метод подходит по синтаксису, чтобы напрямую использоваться в Array.sort().

Производительность линейна, в строках проверяется ровно столько символов, сколько требуется для получения однозначного ответа. Несмотря на это функция работает в несколько раз медленнее простого сравнения строк на больше меньше.

Применений для этого типа сортировки великое множество от музыкального плеера до интернет магазина или генератора кода, везде, где список будет отображаться пользователю.

http://code.google.com/p/as3natcompare/
Всего комментариев 0

Комментарии

 

 


Часовой пояс GMT +4, время: 02:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.