[あすかぜ・ねっと]あすかぜ・ねっと自作ソフトCassava > サポート掲示板

Cassava Editor サポート掲示板

スレッド一覧に戻る返信

[32] マクロでのソート処理

いかくん [2005/10/15 07:16:04]

初めまして。簡単な一覧を作りたくて使用させていただい
てます。

今まで手動でやっていた作業をマクロに任せようかと思い
8bitのBASIC以降ご無沙汰だったプログラムもどきを作ろ
うとマクロ作成に挑戦しているのですが、一カ所引っかか
ってしまったので質問させてください。

マクロにてソート処理を指定する方法が本体同梱のヘルプ
には載っていないのですが、このサイトのリファレンスに
は「Sort();」が載ってますね。この関数を利用すると、
手動の時と同じく行、列他を指定する開くのですが、逆順
、昇順を指定する事は不可能なのでしょうか?

具体的には、RPGアイテムの所持リストの処理みたいな
ものです。欲しい物「○」入手済み「○」の様な欄が有り

欲しい物「高>安」入手済み「高>安」不要品「高>安」

の順に並べたいんです。

逆ソートが出来ないので
欲しい物「安>高」入手済み「安>高」不要品「安>高」
まではなんとか出来そうなのですが。

どなたかご存じでしたらよろしくご指導ください。

Re: [32] マクロでのソート処理

あすかぜ [2005/10/15 14:22:52]

ちょうどishiさんの掲示板でもソートの話題が出てますね。
http://keikichi.hp.infoseek.co.jp/cassava/

現状では、Sort(); はソートパネルを開くだけなので、マクロでソートを実行するにはソートのロジックを自作しなければなりません。

例えば、1列目に「欲しい物」、2列目に「入手済み」、3列目に値段があるとすると、次のマクロで全体をソートできます。

-------------------------------------------------------
function compare(y1,y2){
 // 1列目の比較
 if([1,y1] == "○" && [1,y2] != "○"){ return 1; }
 if([1,y1] != "○" && [1,y2] == "○"){ return (-1); }
 // 1列目が同じなら2列目の比較
 if([2,y1] == "○" && [2,y2] != "○"){ return 1; }
 if([2,y1] != "○" && [2,y2] == "○"){ return (-1); }
 // 2列目も同じなら3列目の比較
 if([3,y1] > [3,y2]){ return 1; }
 if([3,y1] < [3,y2]){ return (-1); }
 return 0;
}


for(y1 = 1; y1 < Bottom; y1++){
 maxy = y1;
 for(y2 = y1; y2 <= Bottom; y2++){
  if(compare(y2, maxy) > 0){
   maxy = y2;
  }
 }
 for(x = 1; x <= Right; x++){ swap([x,y1],[x,maxy]); }
}
-------------------------------------------------------

条件の修正は compare 内をいじってください。現状では、1列目、2列目に"○"があれば"○"のついたほうを上位に置き、1列目と2列目が同じならば3列目を数値比較しています。
1行目に列名があるならばy1のfor文を2から始めてください。

マクロの標準機能としてソートもほしいところですね(^^;

早速のご返答有り難う御座います

いかくん [2005/10/15 22:01:32]

なるほど。最終的には、そっちの方向で頑張るかと思って
いたのですが、答え聞いちゃった(笑)(^^;

早速のご返答有り難う御座いました。これでなんとかなり
そうです。

Re: 早速のご返答有り難う御座います

あすかぜ [2005/10/16 00:19:42]

どういたしまして。

せっかくなので、クイックソートを実行するマクロをマクロページで公開しました。
http://www.asukaze.net/soft/cassava/macro/

びっくり

いかくん [2005/10/16 01:50:28]

先ほど、クイックソートの方拝見してびっくりしました。
ここまで対応して下さって有り難うございます。恐縮です。

当方の要望、なんとか実現できそうですので頑張ってみ
ます。上に記述して下さったサンプルでの数字比較すべ
き列が全角数字なので、これをfunction内で一度半角変
換してcompareして再度下記戻ししようかな?(文字コー
ド返せるのかな?)ってのと、メインループが正常に終わ
ってない?(100000回でストップ)ので、ここらへんを自
分の条件に合わせて効率化してみようかと思ってます。

うむー。20年のブランクは大きいですわ(笑)


Re: びっくり

いかくん [2005/10/16 01:52:54]

追記。TransCharn発見(^^;

Re: びっくり

あすかぜ [2005/10/16 11:51:02]

そういえば TransCharn なんてありましたねぇ。
対象が選択範囲(Sel*で指定)なんで気をつけてください。

ループ回数が上限に達するなら、クイックソートのコードを使うのもいいかもしれません。
再帰の時は数を数えてないんで、100000回の制限はありません。
かわりに、スタックオーバーフローするとCassavaごと落ちます(汗)

ブランクがどうとかいうより、Cassavaマクロの仕様がデタラメすぎるってのが問題な気もしますが・・・。

スレッド一覧に戻る返信