2013-02-11 2 views
2

Je tente d'écrire une fonction de tri à utiliser avec Array.sort(). Je suis un peu coincé sur la façon dont je peux écrire exactement ce dont j'ai besoin.ActionScript, fonction de tri personnalisée

Dans mes éléments d'application sont ajoutés à ce tableau à différents moments de l'exécution, et chaque fois qu'un élément est ajouté, le tableau est trié. Les éléments de la matrice sont tous des objets et ont tous un "poids" de propriété. Si un poids est plus important, l'objet doit être placé en premier, si c'est moins que l'objet doit aller après. C'est facile et j'ai une fonction qui ressemble à ceci:

return a.weight - b.weight; 

Le problème est que j'ai une exigence supplémentaire que si un élément est ajouté plus tard et il a le même poids comme un autre élément, il doit être mis après élément dans le tableau. Il DOIT aller derrière chaque élément du tableau qui a déjà été ajouté et qui a le même poids.

J'ai de la difficulté à trouver une fonction pour m'assurer que cette exigence est satisfaite à chaque fois.

Merci pour l'aide!

Répondre

5

Pas besoin d'écrire un tri personnalisé, le sortOn du tableau peut gérer ce cas. Vous devrez cependant ajouter un nouveau membre à vos articles, je l'appellerai 'horodatage'.

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

Le premier paramètre définit quelles propriétés seront utilisées pour le tri, le second définit les options pour chaque champ. Voir http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn() pour plus d'informations. Le | -operator (opérateur OU bit à bit) est utilisé pour transmettre plusieurs options pour un champ. Ainsi, dans ce cas, le premier champ ('poids') est trié numériquement et descend.

--edit:

Pour les vecteurs dont vous avez besoin d'utiliser une fonction de comparaison:

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

Merci pour la réponse rapide! Est-il possible de garantir cette commande sans ajouter de nouvelle propriété? – user1513171

+0

Et si je voulais faire ça avec un vecteur? Les vecteurs n'ont aucune fonction sortOn – user1513171

+0

Vous ne voyez pas pourquoi vous avez besoin d'une autre propriété ... essayez 'arr.sortOn (['weight'], [Array.NUMERIC | Array.DESCENDING])' – Teejay

1

Je suggère d'ajouter une autre propriété à l'objet. Quelque chose comme:

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

Ceci vous permettra de garder une trace de l'ordre dans lequel il est entré dans la liste avant le tri. En outre, vous pouvez également envisager de conserver une autre copie du tableau lui-même (avec l'index intact).

+0

@ la personne qui downvoted: Donne une raison sur ce qui est faux ... s'il vous plaît. – loxxy