16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"メソッドでソートするList"
この発言に対し以下のコメントが寄せられています
#01061 TN さん メソッドでソートするList
TListのSortメソッドは比較関数に「ただの関数」を使うので,複数のListを同時
に生成して別々のデータが入っていたりするとき,区別する機能がありません.
言い換えるとオブジェクト指向が不十分で不便です.リエントラントにするのも
ロックするのが関の山.
そこで,Sortの引数にメソッドポインタを取る派生型を作りました.
使い方はSortの引数に入れる比較関数をオブジェクトのメソッドとして作る以外,
TListとまったく同じです.
ex. function SComp( Item1, Item2: Pointer ): integer;
注)SortもQuickSortも override できないので,このリストのインスタンス
を扱う人が派生もとの TList 扱いしてSortした場合,新メソッドは呼ばれません.
/////////////////////////////////////////////////////////////////////////////
type
TListSortCompareMethod = function(Item1, Item2: Pointer):Integer of object;
TObjSortList = class(TList)
protected
procedure QuickSort( SortList: TList; L, R: Integer;
SCompare: TListSortCompareMethod );
public
procedure Sort( Compare: TListSortCompareMethod );
end;
/////////////////////////////////////////////////////////////////////////////
procedure TObjSortList.QuickSort( SortList: TList; L, R: Integer;
SCompare: TListSortCompareMethod );
var
I, J: Integer;
P, T: Pointer;
begin
repeat
I := L;
J := R;
P := SortList[(L + R) shr 1];
repeat
while SCompare(SortList[I], P) < 0 do Inc(I);
while SCompare(SortList[J], P) > 0 do Dec(J);
if I <= J then
begin
T := SortList[I];
SortList[I] := SortList[J];
SortList[J] := T;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then QuickSort(SortList, L, J, SCompare);
L := I;
until I >= R;
end;
procedure TObjSortList.Sort(Compare: TListSortCompareMethod);
begin
if Count > 0 then
QuickSort(Self, 0, Count - 1, Compare);
end;
TN(CQJ01721)
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|