喫茶XRAYトップページ

[スレッド全体
]

[7277] Re:StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 17:04:46 Mr.XRAY
▼ takiさん

> StringListに逐次データが追加される場合、追加の度にsortメソッドを実行するより
> 最初から Sorted := true; にする方が断然速いようです。


あっ,これ,提供しているコンポーネントで,変なところがあって,
メールで指摘されたことがあります.去年です.
もかして,そのメールの送信主って taki さんでしたっけ ?

もう,コンポーネントのソースなんか見直したくもないです.
動いているんだから...
なんてこと書いたら,指摘してくださった方に失礼ですね (^^;


[7280] Re2:StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 19:21:54 taki
▼ Mr.XRAYさん

> もかして,そのメールの送信主って taki さんでしたっけ ?

残念ながら違います。
今回、訳あって実験してみました。

どんな訳だって? な〜いしょ。


[7282] Re3:StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 22:47:34 taki
> 今回、訳あって実験してみました。

白状します。

私が使っているStarter版ではデータベースが使えません。(T_T)

そこでStringGridをデータベース代わりに使っています。

JANコード、商品名、仕入れ単価、売り単価などのマスターテーブルや
入庫、出庫の明細テーブルの処理ではどうしてもJANコードでソートしないと
効率が悪くなってしまいます。

StringGridのソートの例はググると色々と出てくるのですが、よく理解
できません。Object云々…???

それで、「JANコード+StringGridのIndex(行番号)」をStringListに
記憶しソートした後にforループで廻せばJANコード順にStringGridの
IndexでStringGridのデータにアクセスできます。

欠点はデータを削除するとStringGridの順番がずれてしまうことです。

やっぱ、データベースを考えた人は偉いですね。



[7284] Re4:StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 23:24:08 Mr.XRAY
▼ takiさん

TStringGird のソートは結構面倒だと思いますね.
TStringList の文字列のソートとなると思いますが,
列が複数あると面倒ですね.多分.

> やっぱ、データベースを考えた人は偉いですね。

本当にすごいと思います.
古い話で申し訳ないのですが(えっ? いつだって昔話でしょうだって?)
昔,データベースの導入のためにテストした時,
特に,その当時の DB/2 (IBM), Oracle に驚きました.
一体どんな仕組みになっているのか不思議です.


[7288] Re5:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 14:01:12 taki
▼ Mr.XRAYさん
 
> 昔,データベースの導入のためにテストした時,
> 特に,その当時の DB/2 (IBM), Oracle に驚きました.
> 一体どんな仕組みになっているのか不思議です.


はい。今回はStringGridには手をつけずに(Tabelとして)置いて、
StringListをQueryのように使えないかと考えました。

この方法だと、StringGridは何もさわる必要がないので便利です。
一方、Query役のStringListは常にKeyでソートしないといけないので、
StringList.Sort と StringList.Sorted := True ではどちらが
速いのかを調べたわけです。

アイデアは閃いた(昔からあるわ)のですが、実際のプログラムに
組み込むのはこれからです。

たてぐやさんのコードに頼る公算は大です・・・。


[7289] Re6:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 16:12:20 taki
▼ Mr.XRAYさん
▼ たてぐやさん

こんな感じでプログラムできそうです。

http://mrxray.on.coocan.jp/Halbow/Notes/N023.html
[整数値を記憶させる]も参考にしました。


procedure TForm1.Button7Click(Sender: TObject);
var
  i,ix:integer;
  s:string;
  ItemCode,ItemName:string;
begin

  Randomize;
  listBox1.Clear;           // StringGrid役のデータとみなして下さい
  listBox2.Clear;           // クエリー役 本来はStringList
  listBox2.Sorted := true;  // 常にソートされる設定
  listBox3.Clear;           // 結果の確認表示用

  // データが100回追加される処理をしたことに
  for i := 1 to 100 do begin
    // 商品コード番号をランダムに発生
    ItemCode := FormatCurr('000000',Random(1000000));
   // 確認できるように名前の一部に組み込む
    ItemName := 'Item' + FormatCurr('000',i) + '-A';

    // listBox1の最後にデータが追加され、そのIndexがixに入る
    ix := listBox1.Items.Add(ItemCode + ' ' + ItemName + ' @500円');

    // クエリー役のlistBox2にKeyのコード番号とIndexのixを追加する
    // 追加と同時にソートされる
    listBox2.Items.AddObject(ItemCode,TObject(ix));
  end;

  // コード番号順にソートされたデータを取り出す
  for i := 0 to ListBox2.Items.Count - 1 do begin
    ix := integer(ListBox2.Items.Objects[i]);   // Indexを取り出す

    s := ListBox1.Items.Strings[ix];   // StringGrid役からデータを取り出す

    // ここで商品コード毎の集計処理などをする
    listBox3.Items.Append(s);    // 確認のためにListBox3に書き出す
  end;

end;


実行結果です。

ListBox1は商品コードはランダムです。ListBox2が昇順にソートされています。
ListBox3はListBox2と同じ並びになっているのがわかります。
ハイライトは同じデータです。


[7290] Re7:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 22:32:34 taki
>  listBox2.Items.AddObject(ItemCode,TObject(ix));

ItemCodeはいいけど、TObject(ix)はlistBox2.Items.SaveToFileで
保存されないみたいですね。

残念!


[7291] Re8:StringList ソートの速さ比べ返信 削除
2014/3/2 (日) 15:28:56 taki
StringList.Sorted := true;
で StringList.Addすると重複データが弾かれるみたいです。

しかし、
StringList.Sorted := true;
StringList.Duplicates := dupAccept;  // 重複を許可する
で StringList.Addすると重複データもソートされていました。

どうやら初期の設定は
StringList.Duplicates := dupIgnore;  // 無視
のようです。
StringList.Duplicates := dupError; とすると、
重複データがAddされた時に例外処理ができるそうです。

先は長い。


[7300] Re9:StringList ソートの速さ比べ返信 削除
2014/3/4 (火) 23:37:26 Mr.XRAY
▼ takiさん

> 先は長い。

がんばれ,がんばれ !! takiさ〜ん.


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