ActionScript 3.0 の Array.sort と Array.sortOn は不安定なソートなので、オブジェクトのキーでソートする際には注意が必要。
price というメンバを持つオブジェクトを 100 個作って、price をキーにソートする例。まずは Array.sort。
var array:Array = []; var object:Object; for (var i:int = 0; i < 100; i++) { object = {}; object.name = "Test" + (i.toString().length == 1 ? "0" + i : i); object.price = Math.random() * 100 | 0; array.push(object); } array.sort(function(a:Object, b:Object):int { var aPrice:Number = a.price; var bPrice:Number = b.price; if (aPrice > bPrice) { return 1; } else if (aPrice < bPrice) { return -1; } else { return 0; } }); for each (var o:Object in array) { trace(o.name, o.price); }
結果はこうなる。
Test15 0 Test09 1 Test92 1 Test59 2 Test38 3 Test27 4 Test96 4 Test85 5 Test61 5 Test56 7 Test06 7 Test18 7 ...
5 と 7 に不安定な並びがある。
次に Array.sortOn。
array.sortOn("price", Array.NUMERIC);
結果。
Test46 0 Test56 1 Test06 3 Test89 3 Test99 4 Test07 7 Test90 9 Test78 9 Test12 9 Test03 10 Test35 10 ...
9 に不安定な並びがある。
ActionScript 1.0 の頃は、マージソートをポーティングした。そのコードだと比較関数を指定できないので、ActionScript 3.0 版を新しく書き直そうと思う。すでにライブラリがありそうな気もするが。