3

Array.sort()で使用するソート関数を作成しようとしています。でも、必要なものを正確に書く方法に少しこだわっています。

私のアプリでは、実行中のさまざまな時点でアイテムがこの配列に追加され、アイテムが追加されるたびに配列が並べ替えられます。配列内のアイテムはすべてオブジェクトであり、すべてプロパティ「weight」があります。重みが大きい場合はアイテムが最初に移動し、重みが小さい場合はアイテムが後に移動する必要があります。それは簡単で、次のような関数があります。

return a.weight - b.weight;

問題は、アイテムが後で追加され、それが別のアイテムと同じ重みを持つ場合、配列内のそのアイテムの後に配置する必要があるという追加の要件があることです。同じ重みを持つ、すでに追加されている配列内のすべてのアイテムの後ろに配置する必要があります。

毎回要件を満たしていることを確認する機能を思い付くのに苦労しています。

助けてくれてありがとう!

4

2 に答える 2

6

カスタムソートを作成する必要はありません。アレイsortOnはこのケースを処理できます。ただし、アイテムに新しいメンバーを追加する必要があります。これを「タイムスタンプ」と呼びます。

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

最初のパラメーターはソートに使用されるプロパティを定義し、2番目のパラメーターは各フィールドのオプションを定義します。詳細については、 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn()を参照してください。| -operator(ビット単位のOR-operator)は、1つのフィールドに複数のオプションを渡すために使用されます。したがって、この場合、最初のフィールド('weight')は数値で並べ替えられ、降順で並べ替えられます。

- 編集:

ベクトルの場合、比較関数を使用する必要があります。

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 に答える