3

我正在尝试编写一个与 Array.sort() 一起使用的排序函数。我有点坚持我如何才能准确地写出我需要的东西。

在我的应用程序中,项目在整个执行过程中的不同时间被添加到这个数组中,每次添加一个项目时,数组都会被排序。Array 中的项目都是对象,并且都具有“权重”属性。如果重量较大,则该项目应先行,如果重量较小,则该项目应在后。这很容易,我有一个看起来像这样的函数:

return a.weight - b.weight;

问题是我有一个附加要求,如果稍后添加一个项目并且它与另一个项目具有相同的重量,则必须将它放在数组中该项目之后。它必须位于数组中已添加且具有相同权重的每个项目的后面。

我无法想出一个确保每次都满足要求的功能。

谢谢您的帮助!

4

2 回答 2

6

无需编写自定义排序,数组sortOn可以处理这种情况。但是,您需要为您的项目添加一个新成员,我将其称为“时间戳”。

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

第一个参数定义将用于排序的属性,第二个参数定义每个字段的选项。有关详细信息,请参阅http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn()。|-运算符(按位或运算符)用于为一个字段传递多个选项。因此,在这种情况下,第一个字段(“权重”)按数字降序排序。

- 编辑:

对于向量,您需要使用比较函数:

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 );
于 2013-02-11T15:46:07.670 回答
1

我建议向对象添加另一个属性。就像是 :

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

这将允许您在排序之前跟踪它进入列表的顺序。


除此之外,您还可以考虑保留数组本身的另一个副本(索引完整)。

于 2013-02-11T15:49:09.067 回答