AS3 sortOn горе - PullRequest
       7

AS3 sortOn горе

1 голос
/ 19 ноября 2009

У меня есть массив с именем alarmQueue. Я добавляю в него новые массивы с содержимым [часы: int, минуты: int, секунды: int], и я хотел бы использовать alarmQueue.sortOn () для сортировки очереди сигналов тревоги по возрастанию, но у меня проблемы с пониманием логики.

// the function to push the alarm in to a queue
public function setAlarm(_hours:int = 0, _minutes:int = 0, _seconds:int = 0):void
{
    var alarmAsArray:Array = new Array(_hours, _minutes, _seconds);
    alarmQueue.push(alarmAsArray);

    alarmQueue.sortOn([0, [1, 2]], Array.NUMERIC | Array.DESCENDING);
    trace(alarmQueue);
}

Я устанавливаю эти тревоги:

clock.setAlarm(1, 0, 31);  // alarm 1
clock.setAlarm(12, 1, 21); // alarm 2
clock.setAlarm(12, 1, 19); // alarm 3

и получение следующих следов:

1,0,31
12,1,21,1,0,31
12,1,21,12,1,19,1,0,31

Я, кажется, заказываю их как: тревога 2, тревога 3, тревога 1 но я хочу упорядочить их по часам, затем по минутам и секундам.

Может ли кто-нибудь пролить свет на мои проблемы с сортировкой? Ура!


спасибо за отзыв.

Я проверял:

alarmQueue.push(
            {
                hours: _hours,
                minutes: _minutes,
                seconds: _seconds
            });

            alarmQueue.sortOn(
                ['hours', 'minutes', 'seconds'],
                [Array.NUMERIC | Array.ASCENDING, Array.NUMERIC | Array.ASCENDING, Array.NUMERIC | Array.ASCENDING]
            );

            if(alarmQueue.length == 3)
            {
                for(var i:int = 0; i SMALLERTHAN alarmQueue.length; i++)
                {
                    trace(alarmQueue[i].hours,alarmQueue[i].minutes, alarmQueue[i].seconds);
                }
            }

Мне пришлось немного изменить трассировку из-за того, что элементы массива теперь являются объектами, и использовал SMALLERTHAN, так как символ <здесь, кажется, нарушает теги кода, но приложение не будет компилироваться, так как Flex Builder говорил мне Array.ASCENDING not будучи методом сортировки, я проверил liveocs и не нашел там упоминаний об этом. Есть еще предположения? </p>

Ответы [ 2 ]

1 голос
/ 19 ноября 2009

Нашел ответ после некоторого ковыряния. По умолчанию используется метод сортировки по возрастанию, но нет возможности установить Ascending в качестве вторичного метода сортировки. Таким образом, выполняя две сортировки, первая по убыванию минут и секунд, вторая - сортировка по часам без применения параметров, поэтому сортировка по возрастанию!

var alarmAsArray:Array = new Array(_hours, _minutes, _seconds);
            alarmQueue.push(alarmAsArray);

            alarmQueue.sortOn([1, 2]);
            alarmQueue.sortOn([0], Array.DESCENDING);

            if(alarmQueue.length == 3)
            {
                trace(alarmQueue);
            }

это дает правильный вывод: 12,1,19 12,1,21 1,0,31

Большое спасибо всем! муравей

1 голос
/ 19 ноября 2009

Это должно работать, но я не проверял.

public function setAlarm(_hours:int = 0, _minutes:int = 0, _seconds:int = 0):void
{    
  alarmQueue.push(
  {
    hours: _hours,
    minutes: _minutes,
    seconds: _seconds
  });

  alarmQueue.sortOn(['hours', 'minutes', 'seconds'], Array.NUMERIC);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...