2013-02-11 2 views
2

Я пытаюсь написать функцию сортировки для использования с Array.sort(). Я немного зациклен на том, как я могу писать именно то, что мне нужно.Функция пользовательской сортировки ActionScript

В моих приложениях элементы добавляются в этот массив в разное время на протяжении всего выполнения, и каждый раз, когда элемент добавляется, массив сортируется. Элементы в массиве - все объекты, и все они имеют свойство «вес». Если вес больше, предмет должен идти первым, если он меньше, чем должен идти предмет. Это легко и у меня есть функция, которая выглядит следующим образом:

return a.weight - b.weight; 

Проблема в том, у меня есть дополнительное требование, что если элемент будет добавлен позже и имеет такой же вес, как и другой предмет он должен поставить после того, элемент в массиве. Он ДОЛЖЕН идти за каждым элементом в массиве, который уже добавлен с одинаковым весом.

У меня возникли проблемы с функцией, чтобы убедиться, что это требование выполняется каждый раз.

Спасибо за помощь!

ответ

5

Нет необходимости в создании пользовательского сортировки, Array's sortOn может обрабатывать этот случай. Вам, однако, нужно добавить нового участника в свои элементы, я назову его «timestamp».

arr.sortOn([ 'weight', 'timestamp' ], [ Array.NUMERIC | Array.DESCENDING, Array.NUMERIC ]); 

Первый параметр определяет, какие свойства будут использоваться для сортировки, второй определяет параметры для каждого поля. См. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn() для получения дополнительной информации. | -оператор (побитовый OR-оператор) используется для передачи нескольких параметров для одного поля. Итак, в этом случае первое поле («вес») сортируется численно и убывает.

--edit:

Для векторов вам нужно использовать функцию сравнения:

var sortFunc : Function = function (x: <T>, y : <T>):Number{ 
    var dw:Number = y.weight - x.weight 
    if(dw ==0){ 
     //returns negative if y was added later 
     return x.timestamp - y.timestamp; 
    }else{ 
     //returns negative if x has a higher weight 
     return dw; 
    } 
} 
vec.sort(sortFunc); 
+0

Спасибо за быстрый ответ! Есть ли способ гарантировать этот порядок без добавления нового свойства? – user1513171

+0

Что делать, если я хотел сделать это с помощью вектора? Векторы не имеют функции sortOn – user1513171

+0

Не видите, почему вам нужно другое свойство ... try 'arr.sortOn (['weight'], [Array.NUMERIC | Array.DESCENDING])' – Teejay

1

Я хотел бы предложить, чтобы добавить другое свойство объекта. Что-то вроде:

a.index = i; // where, i is the index before sorting 

Это позволит вам отслеживать заказ, который он ввел в список перед сортировкой.


Кроме этого, вы можете также рассмотреть возможность сохранения другой копии массива (с индексом нетронутым).

+0

@ человек, который отказался: дайте причину тому, что не так ... пожалуйста. – loxxy

Смежные вопросы