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

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.08.2007, 16:34
Ieshua вне форума Посмотреть профиль Отправить личное сообщение для Ieshua Найти все сообщения от Ieshua
  № 1  
Ответить с цитированием
Ieshua

Регистрация: May 2004
Адрес: Москва
Сообщений: 76
По умолчанию Сортировка массива & compare Function

Существует массив объектов, у которых есть поле title:String
Информация в нем может быть представлена любыми доступными на клавиатуре символами

Вопрос, как отсортировать массив так, чтобы сначла шли объекты, в которых первые символы title были русские, затем английские, а затем цифры?

Правда ли, что единственный возможный вариант реализации - это использование "compareFunction" внутри которой будет проверка по ASCII коду?
__________________
Улыбка - понятие растяжимое...

Старый 20.08.2007, 16:44
__i вне форума Посмотреть профиль Отправить личное сообщение для __i Найти все сообщения от __i
  № 2  
Ответить с цитированием
__i
 
Аватар для __i

Регистрация: Jan 2004
Адрес: Украина, Харьков
Сообщений: 1,524
Отправить сообщение для __i с помощью ICQ
в твоем случае нужно просто сортировать по убыванию )

(русские буквы > английские букв > цифры )
если например нужно чтобы сначало цифры потом рус потом англ то придеться свою функцию писать полюбому
__________________
33 коровы

Старый 20.08.2007, 18:07
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 3  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Нужно наверное еще опцию выставить - "независимо от регистра". А что такого страшного в сортировке по функции?

Старый 21.08.2007, 12:19
Ieshua вне форума Посмотреть профиль Отправить личное сообщение для Ieshua Найти все сообщения от Ieshua
  № 4  
Ответить с цитированием
Ieshua

Регистрация: May 2004
Адрес: Москва
Сообщений: 76
Array.DESCENDING - делает сортировку в обратном порядке...Т.е. сначала русские от я до А, затем английские от а до Z, а затем цифры от 9 до 0

Задача - есть ничто иное как список пользователей.

Сначала - русские от А до я, затем английские от A до z, затем цифры от 0 до 9

Цитата:
А что такого страшного в сортировке по функции?
Ничего страшного, просто в некоторых случаях придется сравнивать не только первые буквы title'ов
__________________
Улыбка - понятие растяжимое...

Старый 21.08.2007, 22:53
INK• вне форума Посмотреть профиль Отправить личное сообщение для INK• Посетить домашнюю страницу INK• Найти все сообщения от INK•
  № 5  
Ответить с цитированием
INK•
 
Аватар для INK•

Регистрация: Nov 2001
Сообщений: 105
Отправить сообщение для INK• с помощью ICQ
а раздели на 3 массива
с помощю charCodeAt
русские начинаются после тысчи с чем то

Старый 22.08.2007, 12:17
Ieshua вне форума Посмотреть профиль Отправить личное сообщение для Ieshua Найти все сообщения от Ieshua
  № 6  
Ответить с цитированием
Ieshua

Регистрация: May 2004
Адрес: Москва
Сообщений: 76
Цитата:
Сообщение от INK•
а раздели на 3 массива
с помощю charCodeAt
русские начинаются после тысчи с чем то
Уже так и сделал, сначала разделил на 3 массива, затем каждый из них отсортировал как мне нужно, а затем слепил обратно в нужном порядке...
__________________
Улыбка - понятие растяжимое...

Старый 22.08.2007, 23:29
Dr.OH вне форума Посмотреть профиль Отправить личное сообщение для Dr.OH Найти все сообщения от Dr.OH
  № 7  
Ответить с цитированием
Dr.OH

Регистрация: Aug 2003
Сообщений: 299
Отправить сообщение для Dr.OH с помощью ICQ
Цитата:
внутри которой будет проверка по ASCII коду
Цитата:
русские начинаются после тысчи с чем то
...а я всегда думал, что в ASCII 256 символов...
Цитата:
Уже так и сделал, сначала разделил на 3 массива, затем каждый из них отсортировал как мне нужно, а затем слепил обратно в нужном порядке...
Данная задача (сортировка массива и сравнение строк) уже решалась миллиард миллионов раз. Ты выбрал самый неоптимальный вариант.

Старый 23.08.2007, 15:17
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 8  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
А в чём неоптимальность-то?

Во Flash используется алгоритм Quick Sort, трудоёмкость которого от n*log(n) до n^2 (в зависимости от исходных данных).
От того, что массив сортируется по частям, мы практически ничего не проигрываем, а в некоторых случаях даже выигрываем.

Кроме того, compareFuction в данном случае была бы далеко не тривиальной и её выполнение занимало немало времени.
А в случае с поделенным массивом, compareFunction использовать не обязательно - будет использоваться обычный лексикографический порядок.

Старый 23.08.2007, 16:48
Dr.OH вне форума Посмотреть профиль Отправить личное сообщение для Dr.OH Найти все сообщения от Dr.OH
  № 9  
Ответить с цитированием
Dr.OH

Регистрация: Aug 2003
Сообщений: 299
Отправить сообщение для Dr.OH с помощью ICQ
а кто тебе мешает применить любой из алгоритмов быстрой сортировки сразу ко всему массиву, просто немного изменив условие сравнения? И как ты выигрываешь, сортирую массив по частям?

Старый 24.08.2007, 01:58
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 10  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Ещё раз говорю: условие сравнение будет трудоёмким, так как потребуется использовать цикл: сперва сравнить первые буквы, если они равны, то вторые, и так далее.
И всё это скриптом на AS, который явно проиграет нативному сравнению строк.

А в случае разбития массива нам достаточно смотреть только на первые буквы: если русская - в один массив, если латинская - в другой, если цифра - в третий.

Кроме того, quick sort хоть и имеет в идеале трудоёмкость пропорциональную n*log(n), но на некоторых исходных данных трудоёмкость может достигнуть n*n.

Вот предположим нам и попались как раз такие нехорошие данные.
Если массив у нас разбивается на три равные части, то трудоёмкость будет пропорциональна (n/3)^2 + (n/3)^2+(n/3)^2, т.е. 1/3 * n^2.
В случае же сортировки всего массива, трудоёмкость получиться в три раза больше.

Разбиение массива и последующая склейка (по идее) имеют линейную трудоёмкость, и таким образом для здоровых массивов будут незначительными по сравнению с сортировкой.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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