喫茶XRAYトップページ

[スレッド全体
]

[7285] Re:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 08:25:39 たてぐや
▼ takiさん

私はこんなコードを長年使っています。参考になれば。


procedure TFrmMain.GridSort(Grid: TStringGrid; SortCol: Integer);
{===============================================================================
グリッドをソートする。
===============================================================================}
var
  str_St1: TStringList;
  str_St2:  TStringList;
  int_i: Integer;
begin
  str_St1 := TStringList.Create;
  str_St1.Assign(Grid.Cols[SortCol]);

  for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);
  for int_i := 0 to str_St1.Count - 1 do
        str_St1.Strings[int_i] := str_St1.Strings[int_i] + #1 + Format('%.10d',[int_i]);
  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    str_St2 := TStringList.Create;
    str_St2.Assign(Grid.Rows[int_i]);
    str_St1.Objects[int_i - Grid.FixedRows] := str_St2;
  end;
  str_St1.Sort;

  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));
    TStringList(str_St1.Objects[int_i - Grid.FixedRows]).Free;
  end;
  str_St1.Free;
end;


[7286] Re2:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:10:46 taki
▼ たてぐやさん
 
> 私はこんなコードを長年使っています。参考になれば。

たてぐやさん ありがとうございます。
でも、残念ながら私の能力不足のためコードが読み解けません。(T_T)

str_St1.Assign(Grid.Cols[SortCol]);とかは分かります。
ソートのKeyとなるデータをstr_St1にコピーしているのですね。

for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);は見出しの
部分を取り除いて…

for int_i := 0 to str_St1.Count - 1 do
  str_St1.Strings[int_i] := str_St1.Strings[int_i] +
   #1 + Format('%.10d',[int_i]);
ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…

次に、str_St2.Assign(Grid.Rows[int_i]);では
Gridの行のデータ(レコード単位)をStr_St2にコピーして、

str_St1.Objects[int_i - Grid.FixedRows] := str_St2;で
それをオブジェクトとしてStringListに代入?して・・・

つまり、Str_St1にはKeyの文字列とGridの行のデータを持った状態で
Str_St1.Sortする?

その後、
Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));では
str_St1に保存したオブジェクトをTStringListとして取り出して
さらにGridのRowデータとしてコピー(書き換え)する。

で、正しいでしょうか?


[7287] Re3:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:30:35 taki
えっ!
 
> for int_i := 0 to str_St1.Count - 1 do
>   str_St1.Strings[int_i] := str_St1.Strings[int_i] +
>    #1 + Format('%.10d',[int_i]);
> ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…
>


 #1 + Format('%.10d',[int_i]) の部分の役割が…


[7292] Re4:StringList ソートの速さ比べ返信 削除
2014/3/2 (日) 21:41:15 たてぐや
▼ takiさん

 最初に謝ってしまいます。これは私が書いたコードではありません。7年くら
い前に必要生じて、Webで見つけたコードです。ですので、私も読み解いてはい
ません。実際に使ってみたら、思い通りの動作をしてくれるし、汎用性がある
ので、よく使う手続きや関数をまとめたMylib.pasにインプリメントしています。

[7293] Re4:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 08:27:34 TS
▼ takiさん

良く見ていませんが
>#1 + Format('%.10d',[int_i]) の部分の役割が…
これで同じデータが続いた場合、そのデータ分の元の行の順番は
保たれると思います。

[7294] Re5:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 16:15:29 taki
▼ TSさん

> これで同じデータが続いた場合、そのデータ分の元の行の順番は
> 保たれると思います。


了解です。

[7295] Re6:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 16:22:48 TS
▼ takiさん

ちなみに私はDelFusaさんのサイトのNifty の FDELPHI のサンプル蔵アーカイブ
内の下記を使わせてもらっています。

StringGridの並べ替え(2重)
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00092.html


[7297] Re7:StringList ソートの速さ比べ返信 削除
2014/3/3 (月) 18:25:02 Mr.XRAY
こんなのもありますね.
データ量にもよりますが,バブルソートが早いのかな ?

[StringGrid でソートをしたい(1)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid05.html

[StringGrid でソートをしたい(2)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid06.html

[StringGrid でソートをしたい(3)]
http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid07.html

ソートはまだ研究がおこなわれている分野のようです.
数年前に,新しいアルゴリズムの発表が,数学関係の分野であったようです.


[7299] Re8:StringList ソートの速さ比べ返信 削除
2014/3/4 (火) 10:22:10 おかぽん
▼ Mr.XRAYさん

> [StringGrid でソートをしたい(2)]
> http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid06.html


> QuickSort は不安定なソートなので問題がある
との記載がありますけど、

> [StringGrid でソートをしたい(3)]
> http://hp.vector.co.jp/authors/VA015850/delphi/tips/grid07.html


>あ、関数ってポインタで引き渡せるんですよ(笑)
>知らなかった人、そういうものなんです(苦笑)

それなら、「複数列で比較できる関数」をポインタで渡すという解決方法を提示すれば、
QuickSortでもいいんじゃなかと思ったり、思わなかったり。

といいながら、「StringGrid でソートをしたい」の記事を参考にしたという
高速化されたソートの記事をコピペ
[高速マージソート]
http://drang.s4.xrea.com/program/tips/list/sort_mergesort.html


高速化の方法を考えるのが楽しかった時代は、もはや過去の事。
今は、イカに楽して実現するかのほうが主体で、速度はなんて二の次になってます。
PCのスペックも向上したので、それほど気にしなくていいんですよ(たぶん)

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82