本日の成果:お手軽ソートマクロ(Ignore Case版)を作った
前回作ったソートマクロの処理を見直しして、さらに大文字小文字を区別しないタイプのソートのマクロも作ったよ。欲しい人はこちらからどうぞ。
前回のソートマクロは、改行文字の扱いがテキトーで、ソートした部分の改行文字を常にCR+LFに置き換えてしまってた。Windowsを使っている限り、たいていの場合はそれで問題ないのだけれど、そもそもこのマクロでやりたい事はソートであって改行文字の変更ではないので、キチンと元の改行文字を保存するようにした。それから、前回は行の途中から範囲選択してソートをかけるということができたのだけれど、単純に行の途中からを切り取ってソートした結果で置き換えただけだと、ソート結果が一見おかしなことになるので、ちょっと小細工して改行文字をコッソリ挿入するようにしてた。でも、それってあまり意味がないし、今回 改行文字の種類を保存するようにしたわけだけれど、じゃあこの「小細工でコッソリ挿入する改行文字」は、CR, LF, CR+LFのどれを使えばいい? という問題も発生するので、フツーに行の途中から範囲選択されているときはメッセージを出して何もしないことにした。
そして、大文字小文字を区別しない版のマクロも作った。自前の比較関数を用意してsort()に食わせるだけで簡単に好きな順でソートしてもらえるとは、いい時代になったものだ・・・とはいえ「大文字小文字を区別しないで比較する」というズバリそのものの関数はなく(知らないだけかも)、結局「全部大文字に変換したうえでフツーに比較」という方法でやっているので、1回比較するたびに新しいStringのオブジェクトがポコポコ生成されるという、あまり褒められない方式となっております(笑)。ソートって比較のカタマリみたいなものだからすごく効率悪そう。
効率を重視するのだったら、ソート対象の文字列とそれを大文字化したものをペアにしたオブジェクトの配列をソートするようにした方が断然速いとおもう。
ちなみに、上で「全部大文字に変換したうえでフツーに比較」と言ってるけれど、実際はこれだけだと例えば「AAA」と「aaa」が同じものとして扱われ、ソートしたときにどっちが先に来るか判らないので、「全部大文字に変換した上で比較」した結果が等しいときだけは、続けて大文字に変換する前の文字列同士でも比較するようにしてます。
単純にASCIIコード順の場合、A<B<C・・・<Z<a<b<c・・・<z という順で並ぶ。大文字小文字を区別しないでソートしたい場合、A<a<B<b<C<c・・・<Z<z と並ぶのを期待するところ、油断すると A=a<B=b<C=c・・・<Z=z となってしまう、という話でした。
コメントを残す