ActionScript 3.0で始めるオブジェクト指向スクリプティング

第24回 インスタンスの管理と配列の並べ替え

この記事を読むのに必要な時間:およそ 7 分

インスタンスの重ね順を管理する

インスタンスの重ね順を3次元風の表現に合わせて変えるには,まずインスタンスを正しい重ね順に並べ替える必要がある。メインタイムラインのフレームアクション(スクリプト1)では,EllipticMotionインスタンスを配列に納めた。幸いなことに,配列は並べ替えのメソッドArray.sort()を備えている。このメソッドは,以下のように引数なしで配列に対して呼出せる。trace()関数による[出力]の結果を見ると,エレメントの整数が昇順に並べ替えられている。

var my_array:Array = [3, 0, 1, 4, 2];
my_array.sort();
trace(my_array);   // 出力: 0,1,2,3,4

このArray.sort()メソッドには,ふたつ注意がある。1つは,並べ替えた結果の配列が返されるのではなく,参照した配列そのもののエレメントの順序が変わる。もう1つは,その並べ替えの順序はデフォルトでは,文字列のように頭からひと桁ずつ比較したうえで決められる。たとえば,つぎのスクリプトの結果を見てほしい。

var my_array:Array = [30, 0, 1000, 4, 200];
my_array.sort();
trace(my_array);   // 出力: 0,1000,200,30,4

Array.sort()メソッドには,引数として比較関数が指定できる。比較関数というのは,エレメントの並べ替えの順序を指定する関数だ。つまり,比較関数を定義すれば,配列エレメントの並べ順は自由に決められる。

配列.sort(比較関数);
function 比較関数(引数1:データ型, 引数2:データ型):Number {
  // ふたつの引数の比較評価の結果を数値で返す
}

Array.sort()メソッドに比較関数を指定すると,メソッドが配列エレメントを並べ替えるとき,エレメントをふたつずつ取出してはその関数には引数として渡す。比較関数は,そのふたつの引数のエレメントの大小,つまり並べ順を評価して,その結果を次表1のような数値として返す。

表1 比較関数の引数の大小と戻り値

引数の大小戻り値
引数1 < 引数2-1
引数1 = 引数20
引数1 > 引数21

たとえば,数値のエレメントを数値として比べて並べ替えるには,比較関数(compare)をつぎのように定義したうえで,Array.sort()メソッドの引数に指定すればよい。trace()関数の[出力]結果を見ると,今度は数値の小さい順に並べ替えられたことが確かめられる。

var my_array:Array = [30, 0, 1000, 4, 200];
my_array.sort(compare);
function compare(nA:Number, nB:Number):Number {
  if (nA < nB) {
    return -1;
  } else if (nA > nB) {
    return 1;
  } else {
    return 0;
  }
}
trace(my_array);   // 出力: 0,4,30,200,1000

ところで,Array.sort()メソッドの引数には,次表2のようなArray定数も指定できる。数値の小さい順に並べ替えるのであれば,Array.sort()メソッドの引数に定数Array.NUMERICを指定する方がたやすい※2⁠。

var my_array:Array = [30, 0, 1000, 4, 200];
my_array.sort(Array.NUMERIC);
trace(my_array); // 出力: 0,4,30,200,1000

表2 Array.sort()メソッドに指定できるArrayクラスの定数

定数説明
CASEINSENSITIVE英字の大文字小文字を区別せずに並べ替える。
DESCENDING並べ替えの順序を,降順(大きい順)に指定する。
NUMERICエレメントが数値の配列を,その値の大きさで順序づける。
RETURNINDEXEDARRAYターゲットの配列は変更せず,並べ替えた結果の整数インデックスをエレメントとした配列が返される。
UNIQUESORTエレメントに重複がない配列のみを並べ替える。重複があれば,0を返す。
※2
ふたつ以上のArray定数を同時に指定することもできる。その場合は,ビット単位の論理和演算子|を用いて,指定したい定数の論理和をとって,Array.sort()の引数として渡す。たとえば,引数をつぎのように定数で指定すると,エレメントは数値で降順に並べ替えられる。
var my_array:Array = [30, 0, 1000, 4, 200];
my_array.sort(Array.NUMERIC | Array.DESCENDING);
trace(my_array); // 出力: 1000,200,30,4,0
ビット演算ならびにビット単位の論理和演算子|については,Adobeデベロッパーセンター「ActionScript 3.0におけるパフォーマンス向上のヒント」06数値の演算「ビット演算」およびFumioNonaka.com複数のフラグをひとつの整数で表すを参照してほしい。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書