Arrayクラスのsortメソッドを使用すると、配列の並び替えをする事が出来る。
基本的には「データを"文字列"としてみた時のアルファベット順(文字コード順)に並び替え」をし、配列の内容を更新する。
基本的には「データを"文字列"としてみた時のアルファベット順(文字コード順)に並び替え」をし、配列の内容を更新する。
- sort
引数なしの場合、データが文字列として扱われ、その文字列で比較される。var a:Array = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0, "z", "A", "!"]; trace(a); a.sort(); trace(a);
1,3,5,7,9,2,4,6,8,0,z,A,! !,0,1,2,3,4,5,6,7,8,9,A,z
文字列として比較するので、以下のような事結果を得る。var a:Array = [10000,2000,300,40,5]; trace(a); a.sort(); trace(a);
10000,2000,300,40,5 10000,2000,300,40,5
このような状況を回避する為、定数を指定する。
Array.NUMERIC:文字列ではなく数値で比較するように指定。var a:Array = [10000,2000,300,40,5]; trace(a); a.sort(Array.NUMERIC); trace(a);
ここで、要素に数値変換できないデータが混在していると、そのようなデータは NaN として扱われる。10000,2000,300,40,5 5,40,300,2000,10000
ソート関数を指定する場合。
この場合、引数となるのは関数。フォーマットは決まっていて、2つのエレメントを引数にとる関数を指定しなければならない。以下、その関数の基本形。
関数に渡されるエレメントは、配列にあるオブジェクトがそのまま渡されるので、 配列の要素に様々な型が混在する場合に注意が必要。function 比較の関数名 ( エレメント1 , エレメント2 ):Number { if ( エレメント1がエレメント2の前に来るべき条件 ) return -1; if ( エレメント2がエレメント1の前に来るべき条件 ) return 1; return 0; }
ex.) 2次元配列を、それぞれ配列の総和でソートする。結果var a:Array = [[3, 4, 5], [1, 2, 3], [2, 3, 4], [10]]; var i:int; for (i = 0; i < a.length; i++) trace(a[i]); trace("SORT!"); a.sort( function(a:Array, b:Array):int { var a_sum:int = 0; var b_sum:int = 0; var l:int; for (l = 0; l < a.length; l++) a_sum += a[l]; for (l = 0; l < b.length; l++) b_sum += b[l]; if (a_sum < b_sum) return -1; if (a_sum > b_sum) return 1; return 0; } ); for (i = 0; i < a.length; i++) trace(a[i]);3,4,5 1,2,3 2,3,4 10 SORT! 1,2,3 2,3,4 10 3,4,5
