この章では並び替え(以下ソート)について解説していきたいと思います。
ソートにはバブル・クイック・ヒープ等々あります。hspda.dllでは何ソートになるかわかりませんが、
完全な順番どおりにならないこともあるという点から考えて、
完全性の低いことで有名なクイックソートになるのでしょうかね。
まぁここではあまり関係ありませんのでソートの種類はおいときましょう。
まず基本的なソートsortnote命令から入りましょうか。
この命令はソートするものを変数指定しかできません。
並び順はp2で小さい順・大きい順どちらでも指定できます。
優先順位はASCIIコード順ですのでコード番号の小さいものがソートでも小さい値とされます。
buf="aaa\nbbb\naba\nbab\naab\nbaa" pos 50,50 : mes "ソート前\n\n"+buf sortnote buf,0 ; 小さい順 pos 200,50 : mes "ソート後\n\n"+buf
これも前章のcsv形式同様TIPSにバブルソート方法を標準命令でする方法を載せていますのでご参照ください。
sortnoteと似たsortstr命令は、csvnoteとcsvstrの関係と同じで、配列変数をソートする命令です。
sdim buf,3,6 buf="aaa","bbb","aba","bab","aab","baa" pos 50,50 : mes "ソート前\n\n" repeat 6 mes buf.cnt loop sortstr buf,0 pos 200,50 : mes "ソート後\n\n" repeat 6 mes buf.cnt loop
配列変数の数値をソート命令も用意されています。
主にスコアのランキングのソートなどに使うものでしょうか。
randomize dim buf,10 pos 50,50 : mes "全スコア\n\n" repeat 10 rnd r,100 buf.cnt=r num=cnt+1 str num,2 mes "No."+num+" "+r+"ポイント" int num loop sortval buf,1 pos 300,50 : mes "ベスト3\n\n" repeat 3 num=cnt+1 mes ""+num+"位 "+buf.cnt+"ポイント" loop
sortnort,sortstr,sortval命令を使用するとソート前の位置を記憶しておいてくれます。
コレを呼び出すのがsortget命令です。
sortget命令を使用することによって、ソート前のインデックスを知ることができます。
ただ1回で全部のインデックスを知ると言うものではなく、1回で1つのデータの位置しかわかりません。
全部知りたい場合はループさせて全データを知るしかないでしょう。
この命令はsortget以前の最後に行ったソート命令しか呼び出すことができません。
randomize dim buf,10 pos 50,50 : mes "全スコア\n\n" repeat 10 rnd r,100 buf.cnt=r num=cnt+1 str num,2 mes "No."+num+" "+r+"ポイント" int num loop sortval buf,1 pos 300,50 : mes "ベスト3\n\n" repeat 3 sortget moto,cnt : moto+ num=cnt+1 mes ""+num+"位 [No."+moto+"] "+buf.cnt+"ポイント" loop
最後に排他メモリノート命令をしましょう。
排他メモリノートとは、重複したデータは1つのデータとして扱われます。
簡単に書くと「aaa,bbb,ccc,bbb」と言うデータは「aaa」「bbb」「ccc」と言った3データにまとめられるわけです。
まずxnotesel命令で排他メモリノートの対象にする変数を指定します。
1つ気をつけておく点は、排他メモリノートといっても、
次で使用するxnoteadd以外で追加したデータが重複していても重複とみなされません(^^;
buf="aaa\nbbb\nccc\nddd\n" xnotesel buf
単純に排他メモリノートに設定したい変数をxnoteselで指定しましょう。
先ほど書いたxnoteaddでデータを追加していくわけですが、
xnoteselを先にしておかないとHSPがエラーで落ちてしまいます。必ずxnoteselで初期化しておきましょう。
screen 0,150,350 title "" sdim buf,256 sdim add,10 buf="aaa\nbbb\nccc\nddd\n" xnotesel buf objsize 150,25 input add,,,10 button"追加",addbtn listbox index,300,buf stop *addbtn xnoteadd add objprm 2,buf stop
この命令は重複したデータは追加されませんがsortgetで使用する参照カウントだけが更新されますので、
統計データ等を作るときに役に立つと思われます。
非常に簡単でしたがこれにてhspda.DLL編を終了します。