0 votes

Les difficultés de l'AS3 sortOn

J'ai un tableau appelé alarmQueue. J'y insère un nouveau tableau dont le contenu est [hours:int, minutes:int, seconds:int] et j'aimerais utiliser alarmQueue.sortOn() pour trier la file d'attente des alarmes de manière ascendante, mais j'ai du mal à comprendre cette logique.

// 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);
}

Je mets ces alarmes :

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

et j'obtiens les traces suivantes :

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

Il semble que je les ordonne comme suit : alarme 2, alarme 3, alarme 1. mais je veux les classer par heure, puis par minute et par seconde.

Quelqu'un peut-il m'éclairer sur mes difficultés de tri ? A la vôtre !


Merci pour les commentaires.

J'ai testé :

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);
                }
            }

J'ai dû modifier légèrement la trace car les éléments du tableau sont maintenant des objets et j'ai utilisé SMALLERTHAN car le symbole < semble rompre les balises de code ici, mais l'application ne compile pas car Flex Builder me dit que Array.ASCENDING n'est pas une méthode de tri, alors j'ai vérifié livedocs et je n'en ai trouvé aucune mention là aussi. D'autres hypothèses ?

1voto

Lior Cohen Points 4494

Cela devrait fonctionner, mais je ne l'ai pas testé.

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);
}

0voto

anton Points 1

J'ai trouvé la réponse après quelques bricolages. La méthode de tri par défaut est la méthode ascendante, mais il n'y a pas d'option pour définir la méthode ascendante comme deuxième méthode de tri. Donc, en effectuant deux tris, le premier descendant sur les minutes et les secondes, le second est un tri sur les heures sans paramètre appliqué, donc il trie de manière ascendante !

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);
            }

cela donne la sortie correcte de : 12,1,19 12,1,21 1,0,31

Merci beaucoup à tous ! fourmi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X