なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこの配列カスタムソートについて理解したい

配列カスタムソート、あんまり使ったことがない……
マニュアル見てもよくわからない……
いじって試すしかない。

配列カスタムソート ( はいれつかすたむそーと )
引数 {参照渡し=?}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体作る
r0から3まで繰り返す
 c[r]キャラ型して作成
 c[r]名称=「ロボ{r}号」
 c[r]HP=乱数(100)
 c[r]攻撃=乱数(100)

●キャラ表示
 txtとは変数
 r0から3まで繰り返す
   「名称,HP,攻撃」「,」区切って反復
     txtc[r]対象追加 //←パラメータのとりだし
     txtタブ追加
   txt改行追加
 txt表示

●キャラカスタムソート(項目)
 それ=(A項目 - B項目) //←A,Bはキャラ型のグループ A→HP など。
 

//カスタムソート表示
「名称{タブ}HP{タブ}攻撃」表示
キャラ表示

「HP順」表示
c「キャラカスタムソート("HP")」配列カスタムソート
キャラ表示

「攻撃順」表示
c「キャラカスタムソート("攻撃")」配列カスタムソート
キャラ表示

f:id:tkizzz:20201024123418j:plain