文字列並び替え

この章では並び替え(以下ソート)について解説していきたいと思います。

ソートにはバブル・クイック・ヒープ等々あります。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命令は、csvnotecsvstrの関係と同じで、配列変数をソートする命令です。

	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編を終了します。