1

Array.sort() のソート順

Flash 5 の 'Array.sort()' メソッドは、配列内の要素を文字列順に並べ換えます。数字も、メソッド中では、文字列として比較処理されます。したがって、ソート結果は、必ずしも数値の大小と一致しません。



[例]

testArray = [300, 1000, 4, 20];

testArray.sort();

trace (testArray);



//出力ウィンドウの結果

1000,20,300,4

2

比較関数



'Array.sort()' メソッドの引数に「比較関数」を指定すれば、ソート順を独自に定義することができます (『ActionScript リファレンスガイド』 'Array.sort' の項参照)。



[シンタックス]

myArray.sort(比較関数名)



比較関数を指定すると、'Array.sort()' メソッドは、配列から要素を2つずつ (a,b) 比較関数に渡して、その並べ順を確認します。比較関数が 1 を返せば逆順 (a>b)、-1 を返せばその順 (a<b)、戻り値が 0 なら同順 (a=b) として、ソートが実行されます。比較関数は、配列要素が数値であれば数値のまま受取ります。したがって、比較関数を定義すれば、数字の配列を数値順にソートすることができます。

3

数値順のソートを定義した比較関数



数字の配列を数値順にソートする比較関数と、その実行例をご紹介します (下記 [数値順のソートを定義する比較関数])。



比較関数の構造は、比較的シンプルです。まず比較関数 xOrder を定義します ([1])。引数は、'Array.sort()' メソッドから渡される2つの配列要素 (a, b) です。



xOrder は、渡された配列要素の大小を 'if' アクションで評価し、1、-1、0 のいずれかの値を返します。a が b より大きい場合 ([2]) は、並べ換えが逆順になりますので、1 を返します ([3])。a が b より小さい場合 ([4]) は、その順番になるので、-1 を返します ([5])。その他の場合 ([6]) というのは、a と b が同値 (a = b) です。したがって、同順を示す 0 を返します ([7])。



//[数値順のソートを定義する比較関数]

function xOrder (a, b) { //[1]比較関数定義

  if (a>b) {             //[2]逆順の場合

    return 1;            //[3]1を返す

  } else if (a<b) {      //[4]その順の場合

    return -1;           //[5]-1を返す

  } else {               //[6]その他(同順)の場合

    return 0;            //[7]0を返す

  }

}



testArray = [300, 1000, 4, 20];

testArray.sort(xOrder);

trace (testArray);



//出力ウィンドウの結果

4,20,300,1000



1 の例と同じ数字の配列をソートしてみると、比較関数 xOrder により、要素が数値順に並べ換えられたことがわかります (上記 「出力ウィンドウの結果」)。

4

ワンステップアップ - 論理値 (ブール値) と整数値



3
でご紹介した比較関数 xOrder は、もっと簡潔に書くことができます。以下のように、たった 1 行のステートメントです。



//[数値順のソートを定義する比較関数 2]



function xOrder (a, b) {

    return ((a>b)-(a<b));

}



(a>b) や (a<b) は論理式ですので、返る値は true か false の論理値 (ブール値) になります (ブール値については、ActionScript リファレンス > ActionScript を使用したスクリプトの記述 (Flash 5)、または Flash の使用 > ActionScript 言語について (Macromedia Flash MX) の「データ型について」の項参照)。しかし、この値を数値演算子 (たとえば '-') を使った演算式に用いると、ture は 1 に、false は 0 に変換されます。



したがって、上記 [数値順のソートを定義する比較関数 2] は、(a>b) のとき 1、(a<b) であれば -1、それ以外 (a=b) の場合には 0 を返すのです。引数 a、b に具体的な数値を当てはめてみて結果をご確認いただくとよいでしょう。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー