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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.07.2012, 19:50
CyberDude вне форума Посмотреть профиль Отправить личное сообщение для CyberDude Найти все сообщения от CyberDude
  № 1  
Ответить с цитированием
CyberDude
[+3 31.07.12]
[+1 27.08.13]
 
Аватар для CyberDude

Регистрация: Mar 2011
Адрес: 48.434715,35.032285
Сообщений: 56
Отправить сообщение для CyberDude с помощью Skype™
Question [sort] Проблема с сортировкой массива объектов

Условие
Есть определённый массив игроков - гонщиков, у каждого элемента массива есть свойство point и player, где:
  • point - количество пройденных поинтов;
  • player - порядковый номер игрока.

Со временем массив изменяется и количество поинтов у игроков увеличивается.

Задача
Нужно сортировать массив так, чтобы каждый игрок имел такой идентификатор в массиве, который соответствовал бы его положению в гонке.


Решение
Я использовал для решения задачи метод "sort()" для этого, но результат работы меня весьма удивил.

Привожу код:
Код AS3:
array.sort(sorting);
 
function sorting (a:Object, b:Object):int
{
	var response:int = a.point-b.point;
	if (response < 0) response = -1;
	else if (response > 0) response = 1;
	return response;
}
Привожу trace вывод изменений массива (сортировка в данном случае по убыванию, но это не суть):
1. [{"point":0,"player":3},{"point":0,"player":4},{"point":0,"player":2},{"point":0,"player":0},{"point":0,"player":5},{"point":0,"player":6},{"point":1,"player":1}]
2. [{"point":0,"player":2},{"point":0,"player":4},{"point":0,"player":6},{"point":0,"player":3},{"point":0,"player":5},{"point":1,"player":0},{"point":1,"player":1}]
3. [{"point":0,"player":6},{"point":0,"player":4},{"point":0,"player":5},{"point":0,"player":2},{"point":1,"player":3},{"point":1,"player":0},{"point":1," player":1}]
4. [{"point":0,"player":6},{"point":0,"player":4},{"point":0,"player":5},{"point":1,"player":2},{"point":1,"player":3},{"point":1,"player":0},{"point":1," player":1}]
5. [{"point":0,"player":6},{"point":0,"player":4},{"point":1,"player":5},{"point":1,"player":2},{"point":1,"player":3},{"point":1,"player":0},{"point":1," player":1}]
6. [{"point":0,"player":6},{"point":1,"player":4},{"point":1,"player":5},{"point":1,"player":2},{"point":1,"player":3},{"point":1,"player":0},{"point":1," player":1}]
7. [{"point":1,"player":2},{"point":1,"player":4},{"point":1,"player":5},{"point":1,"player":6},{"point":1,"player":3},{"point":1,"player":0},{"point":1," player":1}]
8. [{"point":1,"player":6},{"point":1,"player":4},{"point":1,"player":5},{"point":1,"player":2},{"point":1,"player":3},{"point":1,"player":0},{"point":2," player":1}]
9. [{"point":1,"player":2},{"point":1,"player":4},{"point":1,"player":5},{"point":1,"player":6},{"point":1,"player":0},{"point":2,"player":3},{"point":2," player":1}]
10. [{"point":1,"player":6},{"point":1,"player":4},{"point":1,"player":5},{"point":1,"player":2},{"point":2,"player":0},{"point":2,"player":3},{"point":2," player":1}]
11. [{"point":1,"player":2},{"point":1,"player":4},{"point":1,"player":6},{"point":2,"player":0},{"point":2,"player":5},{"point":2,"player":3},{"point":2," player":1}]
12. [{"point":1,"player":2},{"point":1,"player":6},{"point":2,"player":4},{"point":2,"player":0},{"point":2,"player":5},{"point":2,"player":3},{"point":2," player":1}]
13. [{"point":1,"player":6},{"point":2,"player":0},{"point":2,"player":4},{"point":2,"player":2},{"point":2,"player":5},{"point":2,"player":3},{"point":2," player":1}]


Суть проблемы
Цитата:
Справка Adobe
Возвращенное значение -1 означает, что первый параметр, a, стоит перед вторым, b.
Возвращенное значение 1 указывает, что второй параметр, b, стоит перед первым, a.
Возвращенное значение 0 говорит о том, что элементы равны в контексте сортировки.
Не понятно, почему элементы которые не меняли параметр point, поменяли своё положение в массиссиве. Я почему то думал что элемент массива с свойством player = 0, "передвинется" в начало массива, "подвинув назад" те элементы, у которых значение меньше. Красным выделил один из случаев.

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

П.С.
Возможно методом sort() воспользоватся не получится (как и sortOn() скорее всего), тогда как быть? Писать сортировку вручную?
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них.

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Если что, стабильная сортировка (элементы с одинаковыми значениями не меняют своего положения), портируется с Java впринципе, нормально:
http://www.vogella.de/articles/JavaA...t/article.html
По поводу функции sorting - есть некоторые сомнения в правильности, но мало времени разбираться

Еще стабильности можно достичь, добавив к объекту какое-нибудь фиктивное поле с фиктивным, не меняющимся значением и учитывать его в сортировке.

Старый 04.07.2012, 20:43
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 3  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Потому что 0-это значит, что два элемента равны в контексте сортировки, и поэтому их можно расположить в любом порядке, что логично.
Что sort и делает.
если хотите сохранения позиции, просто в случае
a.point==b.point проверяйте старую позицию в функции sorting

Старый 04.07.2012, 21:06
CyberDude вне форума Посмотреть профиль Отправить личное сообщение для CyberDude Найти все сообщения от CyberDude
  № 4  
Ответить с цитированием
CyberDude
[+3 31.07.12]
[+1 27.08.13]
 
Аватар для CyberDude

Регистрация: Mar 2011
Адрес: 48.434715,35.032285
Сообщений: 56
Отправить сообщение для CyberDude с помощью Skype™
Цитата:
Сообщение от Krusty Посмотреть сообщение
Потому что 0-это значит, что два элемента равны в контексте сортировки, и поэтому их можно расположить в любом порядке, что логично.
Что sort и делает.
если хотите сохранения позиции, просто в случае
a.point==b.point проверяйте старую позицию в функции sorting
Если честно, не понял, как это всё сделать. Если не сложно, не могли бы вы показать реально работающий пример?
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них.

Старый 04.07.2012, 21:36
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Сортировка сначала по точке, потом по индексу игрока (по идее, этого достаточно, даже без стабильной сортировки)
Код AS3:
function sorting (a:Object, b:Object):int
{
	if (a.point == b.point)
        {
              return a.player - b.player
         }
	return a.point - b.point;
}
Альтернативное решение:
Код AS3:
function sorting (a:Object, b:Object):int
{
	return (a.point * 100500 + a.player) - (b.point * 100500 + b.player);
}
Но последнее будет работать неправильно при отрицательных значениях и при a.player >= 100500.

Старый 04.07.2012, 21:43
CyberDude вне форума Посмотреть профиль Отправить личное сообщение для CyberDude Найти все сообщения от CyberDude
  № 6  
Ответить с цитированием
CyberDude
[+3 31.07.12]
[+1 27.08.13]
 
Аватар для CyberDude

Регистрация: Mar 2011
Адрес: 48.434715,35.032285
Сообщений: 56
Отправить сообщение для CyberDude с помощью Skype™
Цитата:
Сообщение от expl Посмотреть сообщение
Код AS3:
function sorting (a:Object, b:Object):int
{
	if (a.point == b.point)
        {
              return a.player - b.player
         }
	return a.point - b.point;
}
Мне больше нравится. Очень не плохой выход, и именно к месту! Спасибо за то что вникли в задачу.

Завтра на работе попробую
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них.


Последний раз редактировалось CyberDude; 04.07.2012 в 21:46. Причина: Добавил
Старый 04.07.2012, 22:02
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 7  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
ЗЫ. Ваши соображения, что элемент должен оставаться на месте, работали бы в случае сортировки "пузырьком" итп, а ее уже давным-давно никто не использует.

Старый 04.07.2012, 22:07
CyberDude вне форума Посмотреть профиль Отправить личное сообщение для CyberDude Найти все сообщения от CyberDude
  № 8  
Ответить с цитированием
CyberDude
[+3 31.07.12]
[+1 27.08.13]
 
Аватар для CyberDude

Регистрация: Mar 2011
Адрес: 48.434715,35.032285
Сообщений: 56
Отправить сообщение для CyberDude с помощью Skype™
Цитата:
Сообщение от Krusty Посмотреть сообщение
ЗЫ. Ваши соображения, что элемент должен оставаться на месте, работали бы в случае сортировки "пузырьком" итп, а ее уже давным-давно никто не использует.
Да, я понимаю что в пузырьковом это работает. Но я не знаю к сожалению алгоритма работы метода sort
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них.

Старый 04.07.2012, 23:23
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
ЗЫ. Ваши соображения, что элемент должен оставаться на месте, работали бы в случае сортировки "пузырьком" итп, а ее уже давным-давно никто не использует.
Не только пузырёк стабилен.
Сортировка слиянием - одна из простых и эффективных стабильных сортировок (вверху ссылку давал)
И сложность у неё как у быстрой сортировки - n log n, хотя сама по себе в пару раз медленнее работает.


Последний раз редактировалось expl; 04.07.2012 в 23:29.
Старый 05.07.2012, 00:57
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 10  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
в sort, скорее всего, сидит не один вариант алгоритма, так как любой из алгоритмов сортировки порядка N * logN есть баланс между скоростью(а различия могут быть существенны) и расходом памяти.
Так что на ее поведение, не описанное в документации, точно полагаться не стоит.

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

Теги
AS3 , sort , сортировка

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

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


 


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


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