お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"RE:TListのSortで注意"

この発言は
#00671 草薙いっぺい さんのRE:TListのSortで注意
に対するコメントです

この発言に対し以下のコメントが寄せられています
#00673 TN さん RE^2:TListのSortで注意

自己レスです。 ---------------------------------------------------------- サンプルを作成してみました。 Memo1の数値列を Memo2にSort後出力しました。 (あくまでサンプルなので 数値列そのもののSortです。) ---------------------------------------------------------- で、やっぱり TNさんの TAcntSubject,TAllotNote,SelectedSubjectTmpとか解りません。 class.pas とか いろいろ覗きましたが.... ---------------------------------------------------------- <参考にさせて頂いた内容> 1.Beepさん、あほうどりさんの過去ログ (なんと 97/04) 2.サンプル蔵のCellさんの例 3.サンプル蔵のべあさんのマージソート例...無断借用しています。m(__)m ---------------------------------------------------------- implimentation以降です。 var aTable: array of Double; // Sort対象数値列 SortType: Boolean; // 昇順:True 降順:False type TMergeList = class(TList) public procedure Sort(Compare: TListSortCompare); end; procedure TMergeList.Sort(Compare: TListSortCompare); var Tmp:PPointerList; procedure MergeSort(First,Last: Integer); var I,J,K,P,Mid:Integer; begin if First < Last then begin Mid :=(First + Last) div 2; MergeSort(First,Mid); MergeSort(Mid+1,Last); P := Mid - First + 1; System.Move(List^[First],Tmp^[0], P * SizeOf(Pointer)); i := Mid + 1; J := 0 ; k := first; while (i <= Last) and (J < P) do if Compare(Tmp^[J],List^[I]) > 0 then begin List^[k] := List^[i]; Inc(k); Inc(i); end else begin List^[k] := Tmp^[j]; Inc(k); Inc(J); end; while j < P do begin List^[K] := Tmp^[j]; Inc(k); Inc(j); end; end; end; begin GetMem(Tmp,(count div 2 + 1) * SizeOf(Pointer)); try MergeSort(0,Count-1); finally FreeMem(Tmp); end; end; {以上は べあさんの MergeSortの機能を試したくて利用させて頂きました。} {Sort比較コールバック関数} function SortFunc(Item1,Item2: Pointer): Integer; var D1,D2: Double; begin D1 := Double(Item1^); D2 := Double(Item2^); if SortType then begin if D1 < D2 then Result := -1 else if D1 > D2 then Result := 1 else Result := 0; end else begin if D1 < D2 then Result := 1 else if D1 > D2 then Result := -1 else Result := 0; end; end; procedure TForm1.GoBtnClick(Sender: TObject); var N: Integer; StTime:TDateTime; MList: TMergeList; {Sort対象テーブルセット} procedure MemoToTable; var N: Integer; begin SetLength(aTable,Memo1.Lines.Count); for N := 0 to Memo1.Lines.Count-1 do begin aTable[N] := StrToFloat(Memo1.Lines[N]); end; end; {Sort後のテーブルをMemoにセット} procedure TableToMemo; var N: Integer; PAns: Pointer; Ans: Double; begin Memo2.Clear; for N := 0 to MList.Count-1 do begin PAns := MList.Items[N]; // チョット ドジなやり方です。 Ans := Double(PAns^); // ポインターのお勉強です。(^^;) Memo2.Lines.Add(FloatToStr(Ans)); end; end; begin SortType := CheckBox1.Checked; MList := TMergeList.Create; MemoToTable; {Sort対象テーブル(Pointer)をセット} for N := 0 to High(aTable) do MList.Add(@aTable[N]); StTime := GetTickCount; MList.Sort(SortFunc); StatusBar1.Panels[1].Text := Format('所要時間=%.3n秒',[(GetTickCount-StTime)/1000]); TableToMemo; MList.Free; end; ------------------------------------------------------------------- ではでは。 草薙いっぺいデシタ。 (GBE02547) 98/10/06(火) 19:25 Original document by 草薙いっぺい 氏 ID:(GBE02547)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum