「一気に最後まで読んだ」本、教えて下さい!

ActionScript初心者ですが、宜しければご回答お願いします。

下記スクリプトではtsizeの配列の値のインデックスを比較し、
戻り値として -1 1 0 を得る事ができるのですが、
-1 1 0 の戻り値を処理する工程がわかりません。
trace(alist.sort(tSort));
上記tSort部分に直接 0 や -1 を記入するとエラーになります。
-1 1 0 の戻り値がどのように処理されているのか教えて頂けませんでしょうか?
よろしくお願いします。

var tsize:Array = new Array("SS","S","M","L","LL","XL");

function tSort(a:String, b:String):int {
//配列での位置を調べる
var indexa:int = tsize.indexOf(a);
var indexb:int = tsize.indexOf(b);
if (indexa<indexb) {
return -1;
} else if (indexa>indexb) {
return 1;
} else {
return 0;
}
}

var alist:Array = new Array("LL","M","XL","S","L","SS","M","S");
trace(alist.sort(tSort));

A 回答 (1件)

まず,


書かれていらっしゃるスクリプトをもっと単純化して,
どういう動きをしているのかを観察してみます。

-----------------------
function mySort(A,B):int {
trace(A,B);
return ★;
}
var myArr=new Array("要素0","要素1","要素2","要素3","要素4");
trace(myArr.sort(mySort));
-----------------------

↑これを見ます。



★=0 の場合
----------------------------------
function mySort(A,B):int {
trace(A,B);
return 0;
}
var myArr=new Array("要素0","要素1","要素2","要素3","要素4");
trace(myArr.sort(mySort));
//---↓出力↓---
//要素1 要素2
//要素0 要素2
//要素3 要素2
//要素4 要素2
//要素4 要素2
//要素3 要素2
//要素0 要素2
//要素1 要素2
//要素2,要素1,要素0,要素3,要素4
----------------------------------


★=1 の場合
----------------------------------
function mySort(A,B):int {
trace(A,B);
return 1;
}
var myArr=new Array("要素0","要素1","要素2","要素3","要素4");
trace(myArr.sort(mySort));
//---↓出力↓---
//要素1 要素2
//要素4 要素2
//要素3 要素2
//要素0 要素2
//要素1 要素2
//要素0 要素3
//要素4 要素3
//要素1 要素3
//要素0 要素3
//要素0 要素1
//要素0 要素4
//要素1 要素4
//要素2,要素3,要素4,要素1,要素0
----------------------------------


★=-1 の場合
----------------------------------
function mySort(A,B):int {
trace(A,B);
return -1;
}
var myArr=new Array("要素0","要素1","要素2","要素3","要素4");
trace(myArr.sort(mySort));
//---↓出力↓---
//要素1 要素2
//要素0 要素2
//要素3 要素2
//要素4 要素2
//要素4 要素2
//要素1 要素0
//要素4 要素0
//要素3 要素0
//要素3 要素0
//要素3 要素1
//要素1 要素4
//要素3,要素1,要素4,要素0,要素2
----------------------------------


★の値によって,演算回数は増減しますが,
mySort(A,B) の A と B には,
少なくとも,どれかの要素(真ん中の要素) を軸とした
総当たりの要素ペア が入ることがわかります。

どれかの要素(真ん中の要素) とは上の場合,
myArr[2] = 要素2 です。
その他色々やってみると,
要素数が偶数の場合,どれかの要素(真ん中の要素) は,
後半の1つ目になることがわかります。

細かいことはFlashのソートアルゴリズム自体に関わることなので,
おそらく意識しなくて良いことだと思います。

 mySort(A,B) の A と B には,
 ほぼ総当たりで 要素のペア が入る

ということだけを意識すれば良いと思います。


というわけで,
以上のことを意識してご質問のスクリプトにコメント行を1行ずつ加えると次のようになります。

-------------------------------------------------
// データの順を示す配列 tsize を作成
var tsize:Array=new Array("SS","S","M","L","LL","XL");

//関数tSortの定義(引数:alist[*]要素,alist[*以外]要素)戻り値:整数
function tSort(a:String, b:String):int {

// tsize における alist[*]要素 の順番を調べる
var indexa:int=tsize.indexOf(a);
// tsize における alist[*以外]要素 の順番を調べる
var indexb:int=tsize.indexOf(b);

// alist[*]要素 の順が alist[*以外]要素 の順より小さい時
if (indexa<indexb) {
// alist[*]要素 を alist[*以外]要素 より前にソート
return -1;
// alist[*]要素 の順が alist[*以外]要素 の順より大きい時
} else if (indexa>indexb) {
// alist[*]要素 を alist[*以外]要素 より後にソート
return 1;
// alist[*]要素 の順が alist[*以外]要素 の順と同じ時
} else {
// ソートをしない
return 0;
}
}

// 順を並べかえるデータ配列 alist の作成
var alist:Array=new Array("LL","M","XL","S","L","SS","M","S");

// alist の要素をソート(引数:関数tSort)
trace(alist.sort(tSort));
-------------------------------------------------


だいたい以上のような感じ意味になると思います。


全体的な流れは,

 「Array.sort(引数)
 の 引数 部分に関数をいれておけば,
 その関数に Arrey の2要素ずつが渡されて,
 sort処理の途中で細かい指示ができる。」

というものです。


=== 以下はどうでも良い補足です ======

実行する内容は全く違いますが,
全体的には次のような流れ(やりとり)になっていると思います(コピペで動作可能)。

----------------------------------------------
// 擬似Flash側関数(引数:関数)戻り値:文字列
function flashFunc(A:Function):String {
if (A("男性ですか?")=="はい") {
return "ようこそ。男風呂をゆっくりお楽しみください。";
} else if (A("男性ですか?")=="いいえ") {
return "ここは男風呂です。女風呂へ行ってくださいね。";
} else if (A("女性ですか?")=="はい") {
return "ようこそ。女風呂をゆっくりお楽しみください。";
} else if (A("女性ですか?")=="いいえ") {
return "ここは女風呂です。男風呂へ行ってください!";
}
return "申し訳ありませんがオカマの方は御遠慮ください。";
}

//---↑以上はFlash側で本来見えないとする↑---
//---↓以下はユーザ側で見えるものとする↓---

// 「男性ですか?」という問いに「いいえ」を返す関数を定義
// カスタム関数(引数:文字列) 戻り値:文字列
function myFunc(Q:String):String {
if (Q=="男性ですか?") {
return "いいえ";
}
return null;
}

// カスタム関数を引数として擬似Flash側関数を呼び出し
// その戻り値を出力
trace(flashFunc(myFunc));
----------------------------------------------

妙な例ですみません...。



ソートのイメージ図
「action script 3.0 so」の回答画像1
    • good
    • 0
この回答へのお礼

とても解り易くご回答して頂き有難う御座います。
初心者の自分ではここまで明確に答えを出すことができませんでした。
コメント並びに例題、Img図のお蔭でスッキリする事ができました。
解らないプログラムがあった場合、
BlurFiltanさんの回答手順を参考にさせてもらおうと思います。

それから「function flashFunc」につきまして、
いつも思うのですが、
「おかま」は題材になるのに、「おなべ」はあまり出てこないですね。

ActionScriptを使いこなせるように精進します。
有難う御座いました。

お礼日時:2009/05/26 20:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報