配列カスタムソート、あんまり使ったことがない……
マニュアル見てもよくわからない……
いじって試すしかない。
配列カスタムソート ( はいれつかすたむそーと )
引数 {参照渡し=?}AをSで|Aに
説明 配列AをプログラムS(文字列で与える-比較用変数はAとB)でソートする。Aの内容を書き換える。
マニュアル探査艦にサンプルがあるのでまず見てみる。
名簿は「やすし,30
かつじ,20
ただお,12
ますじ,18」
名簿を「年令順処理」で配列カスタムソートして表示。
●年令順処理
Aを「,」で区切る。A=INT(A\1)
Bを「,」で区切る。B=INT(B\1)
それは、A-B
//ファイル名の配列を更新日時順にカスタムソートするサンプル
ファイル列挙する。
それを「AとBでファイル更新日時比較」で配列カスタムソート
それをメモ記入
●ファイル更新日時比較(AとBで)
A日時とは文字列=Aのファイル更新日時
B日時とは文字列=Bのファイル更新日時
もしA日時<B日時ならば、-1を戻す
違えば、1を戻す
いじってわかったこと
・A,Bは比較用変数という。
・配列カスタムソートから呼ばれる関数はA,Bに値が入った状態で始まる
・A=配列[0] B=配列[1]みたいに要素が入ると思えばOK
・関数終了時の戻り値(「それ」や「戻した値」)を使う。
・戻り値がマイナスの時、Aを上に配置する。(AがB未満)
・戻り値がプラスの時と0の時はBを上に配置する。(BがA以下)
「年令順処理」の元データをいじって同年齢の人を配置してみたところ、
下に配置した人が上にソートされる。
A-Bが0の時、つまり同じ値だと入れ替えが起こるのは表ソートも同じ。
そうそう、表ソートの命令は同じ値だと入れ替えするんですよね……
エクセルのソートでは同じ値は入れ替えしないので、エクセルに慣れているとソート後の順序が違って戸惑う。
配列カスタムソートではエクセル風ソートができる。
A-Bが0の時に入れ替えがおこらなくすればよい。
同じ値の時は0ではなく-1を戻すと入れ替えにならない。
//サンプル
「1,A
2,B
3,C
1,D」をCSV取得
それの0を表ソート //→D,A,B,C の順 Dが同値のAと入れ替わって上にくる
表示
「1,A
2,B
3,C
1,D」をCSV取得
それを「配列カスタムソート用」で配列カスタムソート //→A,D,B,C の順
表示
●配列カスタムソート用
もし(A[0]>B[0])ならば、1を戻す //Bより大きい場合は入れ替えて上へ
違えば、-1を戻す //同値はこっち
まとめ!
・配列カスタムソートは配列から2つとってきてA,Bに入れて比較
・比較結果(戻り値)がマイナスの時はAを上に送る(Aが小さいので、小さい順で上)
・比較結果(戻り値)がプラスの時と0の時はBを上に送る(0だと入れ替えが起こる)
・表ソートでは同値は入れ替えになるが、配列カスタムソートでは同値の入れ替えを防げる
・0のときは-1を戻すようにすればよい
おまけ!
・配列カスタムソートで呼ばれる関数に「Aを表示」などを入れると計算順序がわかる
・たぶんマージソートと呼ばれるアルゴリズム
応用
A,Bはグループであっても動作する。
ゲーム作りをする場合、配列に入れたグループをHP順にする時などに使える。
■キャラ型
・名称
・HP
・攻撃
//キャラを4体作る
rを0から3まで繰り返す
c[r]をキャラ型として作成
c[r]→名称=「ロボ{r}号」
c[r]→HP=乱数(100)
c[r]→攻撃=乱数(100)
●キャラ表示
txtとは変数
rを0から3まで繰り返す
「名称,HP,攻撃」を「,」で区切って反復
txtにc[r]@対象を追加 //←パラメータのとりだし
txtにタブを追加
txtに改行を追加
txtを表示
●キャラカスタムソート(項目)
それ=(A@項目 - B@項目) //←A,Bはキャラ型のグループ A→HP など。
//カスタムソート表示
「名称{タブ}HP{タブ}攻撃」を表示
キャラ表示
「HP順」と表示
cを「キャラカスタムソート("HP")」で配列カスタムソート
キャラ表示
「攻撃順」と表示
cを「キャラカスタムソート("攻撃")」で配列カスタムソート
キャラ表示