TSV/CSVモード時のソートに関してNo.05211
EXZS さん 10/02/24 22:58
 
β43を使用しております。
TSV/CSVモードで昇降ソートを行った場合、同じ内容内での順番がなるべく元の行順
にならないでしょうか?
例えば
1 a
2 b
3 a
4 b
5 a
6 b
7 a
8 b

として、TSVモードにし、a,bの欄で昇順ソートを実施した場合

5 a
3 a
7 a
1 a
8 b
6 b
4 b
2 b

となってかなりランダムになります。
実際に使用するデータは数字の部分が行番号、アルファベットの部分はエラーIDと
なっており、通常は行番号順に出力されたテキストですので、その後の閲覧でも最初
の行順に並べられていると助かります。

[ ]
RE:05211 TSV/CSVモード時のソートに関しNo.05213
秀丸担当 さん 10/02/25 10:50
 

>TSV/CSVモードで昇降ソートを行った場合、同じ内容内での順番がなるべく元の行順
>にならないでしょうか?

サンプルで確かにそうなることが確認できました。
ソートはC標準のqsort(クイックソート)を使っていて、HmFilterとしては2者
を比較する関数があるだけなのですが、qsortは比較結果が同じだとそうなって
しまうようです。
ソート方式を変えると速度が遅くなってしまうと思うので、文字列が一致する場
合に限ってさらに行番号も比較するようにすると速度にもあまり影響が無いかも
しれません。
そのように修正してみて次のβ版に入れさせていただきます。

[ ]
RE:05213 TSV/CSVモード時のソートに関しNo.05222
colder さん 10/02/26 15:17
 
β44で比較対象が右端のカラムであるときは、
同値のデータの並び順がソート前の並び順になるようになりましたが、
比較対象が右端以外だと次のカラムの大小関係の順にソートされるようです。
比較対象に指定したカラム以外は比較しなくすることは出来ないでしょうか?

テストケース
これを2番目のカラムの順でソート
1 a 8
2 b 7
3 a 6
4 b 5
5 a 4
6 b 3
7 a 2
8 b 1

β44での結果
7 a 2
5 a 4
3 a 6
1 a 8
8 b 1
6 b 3
4 b 5
2 b 7

[ ]
RE:05222 TSV/CSVモード時のソートに関しNo.05223
秀丸担当 さん 10/02/26 15:56
 

>β44で比較対象が右端のカラムであるときは、
>同値のデータの並び順がソート前の並び順になるようになりましたが、
>比較対象が右端以外だと次のカラムの大小関係の順にソートされるようです。
>比較対象に指定したカラム以外は比較しなくすることは出来ないでしょうか?

報告ありがとうございます。
サンプルデータで確かにそうなることが確認できました。
カラムの先頭を対象の開始としているだけでそれ以降も普通の文字列として比較
してしまっていました。
指定のカラムの内容だけが対象となるように修正させていただきます。

[ ]
RE:05213 TSV/CSVモード時のソートに関しNo.05225
colder さん 10/03/01 01:13
 
降順でソートしたとき、同値のデータの並び順がもとの逆になるのは仕様でしょうか?
もとと同じ順にしたいときは2回ソートすればいいだけなので、困ることはないので
すが。

[ ]
RE:05225 TSV/CSVモード時のソートに関しNo.05227
秀丸担当 さん 10/03/01 11:04
 

>降順でソートしたとき、同値のデータの並び順がもとの逆になるのは仕様でしょうか?
>もとと同じ順にしたいときは2回ソートすればいいだけなので、困ることはないので
>すが。

行番号を要素に加えただけのため、確かに逆順にすると全てが逆順になりました。
降順の場合は行番号を反転させればいいだけだと思うので、降順ソート時も元の
順番を維持できるように次のβ版で修正させていただきます。

[ ]
RE:05227 TSV/CSVモード時のソートに関しNo.05229
Iranoan さん 10/03/01 15:25
 
 秀丸担当さん今日は、Iranoan です。
> ソートはC標準のqsort(クイックソート)を使って
との事ですが、いっその事 C++ の stable_sort() を使ってはどうでしょう?
 アルゴリズムの種類は、処理系によって異なるので、遅くなる可能性はあり
ますが、
> 行番号を要素に加えた
が無くなるので、速くなる可能性もあります。
 配列ではなく、list クラスを使う事になるので、メモリは食いそうです
が....。

[ ]
RE:05229 TSV/CSVモード時のソートに関しNo.05230
秀丸担当 さん 10/03/01 17:20
 

>との事ですが、いっその事 C++ の stable_sort() を使ってはどうでしょう?
> アルゴリズムの種類は、処理系によって異なるので、遅くなる可能性はあり
>ますが、

情報ありがとうございます。
stable_sortについて調べてみましたが、遅くなるのと、単に置き換えるだけで
はなくてSTLを使わなくてはいけなくて、プログラムサイズも増えるということ
からやめておこうと思います。
qsortで要素を加えるだけで高速に問題なくできそうなので、このままにしてお
こうと思います。

[ ]