![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+3 31.07.12]
[+1 27.08.13] |
Условие
Есть определённый массив игроков - гонщиков, у каждого элемента массива есть свойство point и player, где:
Со временем массив изменяется и количество поинтов у игроков увеличивается. Задача Нужно сортировать массив так, чтобы каждый игрок имел такой идентификатор в массиве, который соответствовал бы его положению в гонке. Решение Я использовал для решения задачи метод "sort()" для этого, но результат работы меня весьма удивил. Привожу код: 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; } 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}] Суть проблемы Цитата:
Прошу помочь мне разобраться в чём тут дело и как разрешить данную проблему, мне нужно чтобы равные по параметрам элементы массива не менялись местами как показанно в trace выводе. П.С. Возможно методом sort() воспользоватся не получится (как и sortOn() скорее всего), тогда как быть? Писать сортировку вручную?
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них. |
|
|||||
|
Если что, стабильная сортировка (элементы с одинаковыми значениями не меняют своего положения), портируется с Java впринципе, нормально:
http://www.vogella.de/articles/JavaA...t/article.html По поводу функции sorting - есть некоторые сомнения в правильности, но мало времени разбираться Еще стабильности можно достичь, добавив к объекту какое-нибудь фиктивное поле с фиктивным, не меняющимся значением и учитывать его в сортировке. |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 393
|
Потому что 0-это значит, что два элемента равны в контексте сортировки, и поэтому их можно расположить в любом порядке, что логично.
Что sort и делает. если хотите сохранения позиции, просто в случае a.point==b.point проверяйте старую позицию в функции sorting |
|
|||||
|
[+3 31.07.12]
[+1 27.08.13] |
Если честно, не понял, как это всё сделать. Если не сложно, не могли бы вы показать реально работающий пример?
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них. |
|
|||||
|
Сортировка сначала по точке, потом по индексу игрока (по идее, этого достаточно, даже без стабильной сортировки)
function sorting (a:Object, b:Object):int { if (a.point == b.point) { return a.player - b.player } return a.point - b.point; } Но последнее будет работать неправильно при отрицательных значениях и при a.player >= 100500. |
|
|||||
|
[+3 31.07.12]
[+1 27.08.13] |
Цитата:
Завтра на работе попробую ![]()
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них. Последний раз редактировалось CyberDude; 04.07.2012 в 21:46. Причина: Добавил |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 393
|
ЗЫ. Ваши соображения, что элемент должен оставаться на месте, работали бы в случае сортировки "пузырьком" итп, а ее уже давным-давно никто не использует.
|
|
|||||
|
[+3 31.07.12]
[+1 27.08.13] |
Да, я понимаю что в пузырьковом это работает. Но я не знаю к сожалению алгоритма работы метода sort
__________________
Хоть ты эту красоту не назовёшь граблями, всё равно никогда не наступай на них. |
|
|||||
|
Цитата:
Сортировка слиянием - одна из простых и эффективных стабильных сортировок (вверху ссылку давал) И сложность у неё как у быстрой сортировки - n log n, хотя сама по себе в пару раз медленнее работает. Последний раз редактировалось expl; 04.07.2012 в 23:29. |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 393
|
в sort, скорее всего, сидит не один вариант алгоритма, так как любой из алгоритмов сортировки порядка N * logN есть баланс между скоростью(а различия могут быть существенны) и расходом памяти.
Так что на ее поведение, не описанное в документации, точно полагаться не стоит. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| AS3 , sort , сортировка |
|
|