私はDelphi5を初めて使用map
し、C ++と同じ機能(つまり、ソートされた辞書)を実行するコンテナー(理想的には組み込みのコンテナー)を探しています。私は予備的なグーグル検索をしました、しかし明白なものはそれ自身を示唆しているようには見えません。誰かが私を正しい方向に向けることができますか?
4 に答える
TDynArray
ラッパーを見てください。
これは、既存の動的配列(レコードの動的配列を含む)のラッパーであり、動的配列に同様のTList
メソッドを追加します。検索、並べ替え、ハッシュ、バイナリシリアル化などのさらに多くの機能を備えています。外部Count
変数を使用して配列容量を設定できるため、挿入がはるかに高速になります。
type
TGroup: array of integer;
var
Group: TGroup;
GroupA: TDynArray;
i, v: integer;
Test: RawByteString;
begin
GroupA.Init(TypeInfo(TGroup),Group); // associate GroupA with Group
for i := 0 to 1000 do begin
v := i+1000; // need argument passed as a const variable
GroupA.Add(v);
end;
v := 1500;
if GroupA.IndexOf(v)<0 then // search by content
ShowMessage('Error: 1500 not found!');
for i := GroupA.Count-1 downto 0 do
if i and 3=0 then
GroupA.Delete(i); // delete integer at index i
Test := GroupA.SaveTo; // serialization into Test
GroupA.Clear;
GroupA.LoadFrom(Test);
GroupA.Compare := SortDynArrayInteger;
GroupA.Sort; // will sort the dynamic array according to the Compare function
for i := 1 to GroupA.Count-1 do
if Group[i]<Group[i-1] then
ShowMessage('Error: unsorted!');
v := 1500;
if GroupA.Find(v)<0 then // fast binary search
ShowMessage('Error: 1500 not found!');
この例では整数の配列を使用していますが、文字列、ネストされた動的配列、またはその他のレコードを含むレコードの配列でも使用できます。
Delphi5からXEまで動作します。
ジェネリックスよりも使いやすいと思います(自動シリアル化機能など)。;)
http://blog.synopse.info/post/2011/03/12/TDynArray-and-Record-compare/load/save-using-fast-RTTIを参照してください
D5に含まれていない場合はTHashedStringList
、おそらくこれ(OmniThreadLibraryから)が機能します。
https://github.com/gabr42/OmniThreadLibrary/blob/master/src/GpStringHash.pas
私は引用します:
Delphi2007でテスト済み。古いバージョンでも動作するはずです。
さて、あなたのバージョンは間違いなく古いです:)
これは、TList.SortまたはTObjectList.Sortを使用してD5で「箱から出してすぐに」実行できます。この場合、次の行に沿ってクラスを実装することをお勧めします。
TMyClass
public
Index:integer;
Value:TWhatever;
...
end;
リストに格納するには、並べ替えにインデックス値を使用してTList.SortまたはTObjectList.Sortを実装します。少し手間がかかりますが、ひどいことではありません。実装の詳細については、これらのクラスのD5ヘルプを参照してください。
残念ながら、D5にはジェネリックスがないため、多くの型キャストを行うか、さまざまな型の冗長コンテナクラスを開発する必要があります。
これは思い出を呼び戻します。あなたのようなDelphiの古代バージョンに適した別の興味深いテクニックがあります。読む!
あなたの説明から、あなたはかなり一般的なコンテナが欲しいように聞こえます-つまり、さまざまなタイプで使用できるコンテナです。これはジェネリックスを求めて叫びます(はい、新しいDelphiを使用してください!)しかし、昔は、一連のsとsを使用して、 2009年以前のDelphiでテンプレート/ジェネリックスを実装するための少しハッキーな方法がありました。少しグーグルがかかりましたが、これは私が覚えているものとよく似たこれらの「ジェネリック」に関する記事です。2001年からです。当時、Delphi5はまだ最近のものでした。define
include
大まかな考え方は次のとおりです。型に対して必要なこと(ここでは、キーから値へのマップ)を実行するクラスを作成し、それを機能させます。次に、そのファイルを変更して、タイプに特定の名前(TMyType
実際には何でも)を使用し、ファイルを削除して、有効なユニットではなく、コードのみが含まれるようにします。(実際には、2つの部分ファイルがあると思います。1つはinterface
セクション用、もう1つはimplementation
。)を使用してファイルの内容をインクルードする{$include ...}
ため、Pascalファイル全体が定義を使用してコンパイルされ、次にそれらの定義を使用する他の部分的にインクルードされたファイルのコンテンツがコンパイルされます。 。きちんとした、ハッキー、醜い?わかりませんが、機能します:)
サンプルの記事では、型指定されたオブジェクトリスト(つまり、ではなく、などのリスト)が作成TObject
さTMemo
れますTButton
。最終的には次のようなファイルになります(リンクされた記事からコピーされたもの)。
unit u_MemoList;
interface
uses
Sysutils,
Classes,
Contnrs,
StdCtrls;
{$define TYPED_OBJECT_LIST_TEMPLATE}
type
_TYPED_OBJECT_LIST_ITEM_ = TMemo;
{$INCLUDE 't_TypedObjectList.tpl'}
type
TMemoList = class(_TYPED_OBJECT_LIST_)
end;
implementation
{$INCLUDE 't_TypedObjectList.tpl'}
end.
このクラスに基づいて作成できるはずですが、独自のマップのようなクラスを作成する必要があります。以前は、この手法を使用した可能性のある「汎用」コンテナのセットがWebの周りに浮かんでいたことを覚えています。その中には、マップが含まれていると思います。私はそれがどこにあるのか、それが誰によってなされたのかわからないのではないかと思います。この種のことをグーグルで検索すると、Delphiの最新バージョンで多くの結果が得られます。自分で書くのが一番かもしれません。
編集:同じ記事(同じテキストとコンテンツ)を見つけましたが、EmbarcaderoDeveloperNetworkサイトでより適切にフォーマットされています。
幸運を!