« 書籍名と目次 | メイン | ActionScript3.0サマーキャンプ »

3.1配列の操作(8)配列の値の並びをソートする sort()

■配列の値の並びをソートする sort()
配列の値をソートするメソッドにはsort()とsortOn()があります。sort()は引数を指定することで昇順や降順、同じ値が混ざっていないかどうかなどをチェックできます。
sort()は値をストリングで判断しUnicodeに基づいて昇順に並べ替えます。アルファベットはABC順になりますが、先に大文字、次に小文字の順に並びます。大文字小文字を区別せずに並べたい場合には、引数で指示するオプションに1またはArray.CASEINSENSITIVEを指定します。

[:sample:] sort-1.fla
例:昇順に並べる
var vlist:Array = new Array("blue","red","YELLOW","black","BROWN");
trace(vlist.sort());
//出力:BROWN,YELLOW,black,blue,red
trace(vlist.sort(Array.CASEINSENSITIVE));
//出力:black,blue,BROWN,red,YELLOW

降順に並べるには、オプションに2またはArray.DESCENDINGを指定します。大文字小文字を区別せずに降順に並ぶようにするには、sort(1|2)のように論理和の演算子|を使って複数のオプションを指定します。

[:sample:] sort-2.fla
例:降順に並べる
var vlist:Array = new Array("blue","red","YELLOW","black","BROWN");
trace(vlist.sort(Array.DESCENDING));
//出力:red,blue,black,YELLOW,BROWN
trace(vlist.sort(1|2));
//出力:YELLOW,red,BROWN,blue,black

オプションに4またはArray.UNIQUESORTを指定すると、配列をソートする前に配列に同じ値が混ざっていないかどうかをチェックできます。同じ値が混ざっている場合は値の並び替えを行わずに0を返します。
次の例では、vlistには"red"と"Red"含まれています。このとき、大文字小文字を区別せずにソートする指定ならばvlistには同じ値が含まれていないと判断されますが、sort(1|4)のように大文字小文字を区別しないというオプションも合わせると"red"と"Red"は同じ値とみなされて値の並べ替えは実行されずに0が返ってきます。

[:sample:] sort-4.fla
例:同じ値が混ざっていなければ昇順に並べる
var vlist:Array = new Array("blue","red","YELLOW","black","Red");
trace(vlist.sort(Array.UNIQUESORT));
//出力:Red,YELLOW,black,blue,red
trace(vlist.sort(1|4));
//出力:0

値を数値として並べるにはオプションに16またはArray.NUMERICを指定する必要があります。数値として並べない場合、10と9では10のほうが小さな値になってしまいます。sort(16|2)のようにすれば数値を降順、つまり大きな数値から順に並べます。

[:sample:] sort-16.fla
例:数値として並べる
var vlist:Array = new Array(10,1,6,9,5);
trace(vlist.sort());
//出力:1,10,5,6,9
trace(vlist.sort(Array.NUMERIC));
//出力:1,5,6,9,10
trace(vlist.sort(16|2));
//出力:10,9,6,5,1

配列に対してsort()を実行すると元の配列の値の並びを変更しますが、オプションに8またはArray.RETURNINDEXEDARRAYを指定した場合は元の値の並びを変更しません。その代わりに値を並び替えるとどうなるかを、値のインデックス番号の並びで返します。

[:sample:] sort-8.fla
例:ソートした場合のインデックス番号を調べる
var colorlist:Array = new Array("blue","red","black");
trace(colorlist.sort(1|8));
//出力:2,0,1

たとえば、メンバー名簿memberlistと得点表pointlistがあるとします。名簿から得点のベスト3を選びたいという場合、pointlistをソートすれば得点順でポイントを並べることができますが、それでは誰がどの得点なのかがわからなくなってしまいます。そこでpointlistをソートした場合のインデックス番号の並びのrankingリストを作り、rankingリストを使ってmemberlistからベスト3のメンバーを取り出します。

[:sample:] sort-best3.fla
例:得点リストを参照してベスト3のメンバーを調べる
var memberlist:Array = new Array("佐藤","高橋","坂本","野村","青木");
var pointlist:Array = new Array(18,15,9,10,21);
var ranking:Array = pointlist.sort(2|16|8);//降順|数値|インデックス
var top3:Array = new Array();
top3.push(memberlist[ranking[0]]);
top3.push(memberlist[ranking[1]]);
top3.push(memberlist[ranking[2]]);
trace(top3);
//出力:青木,佐藤,高橋

About

2007年7月 7日 08:39に投稿されたエントリーのページです。

ひとつ前の投稿は「書籍名と目次」です。

次の投稿は「ActionScript3.0サマーキャンプ」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。