4

私はDelphi5を初めて使用mapし、C ++と同じ機能(つまり、ソートされた辞書)を実行するコンテナー(理想的には組み込みのコンテナー)を探しています。私は予備的なグーグル検索をしました、しかし明白なものはそれ自身を示唆しているようには見えません。誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

3

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を参照してください

于 2011-08-12T15:17:18.557 に答える
1

D5に含まれていない場合はTHashedStringList、おそらくこれ(OmniThreadLibraryから)が機能します。

https://github.com/gabr42/OmniThreadLibrary/blob/master/src/GpStringHash.pas

私は引用します:

Delphi2007でテスト済み。古いバージョンでも動作するはずです。

さて、あなたのバージョンは間違いなく古いです:)

于 2011-08-12T14:44:18.010 に答える
1

これは、TList.SortまたはTObjectList.Sortを使用してD5で「箱から出してすぐに」実行できます。この場合、次の行に沿ってクラスを実装することをお勧めします。

  TMyClass
   public  
      Index:integer;
      Value:TWhatever;
      ...
   end;

リストに格納するには、並べ替えにインデックス値を使用してTList.SortまたはTObjectList.Sortを実装します。少し手間がかかりますが、ひどいことではありません。実装の詳細については、これらのクラスのD5ヘルプを参照してください。

残念ながら、D5にはジェネリックスがないため、多くの型キャストを行うか、さまざまな型の冗長コンテナクラスを開発する必要があります。

于 2011-08-13T22:05:23.913 に答える
0

これは思い出を呼び戻します。あなたのようなDelphiの古代バージョンに適した別の興味深いテクニックがあります。読む!

あなたの説明から、あなたはかなり一般的なコンテナが欲しいように聞こえます-つまり、さまざまなタイプで使用できるコンテナです。これはジェネリックスを求めて叫びます(はい、新しいDelphiを使用してください!)しかし、昔は、一連のsとsを使用して、 2009年以前のDelphiでテンプレート/ジェネリックスを実装するための少しハッキーな方法がありました。少しグーグルがかかりましたが、これは私が覚えているものとよく似たこれらの「ジェネリック」に関する記事です。2001年からです。当時、Delphi5はまだ最近のものでした。defineinclude

大まかな考え方は次のとおりです。型に対して必要なこと(ここでは、キーから値へのマップ)を実行するクラスを作成し、それを機能させます。次に、そのファイルを変更して、タイプに特定の名前(TMyType実際には何でも)を使用し、ファイルを削除して、有効なユニットではなく、コードのみが含まれるようにします。(実際には、2つの部分ファイルがあると思います。1つはinterfaceセクション用、もう1つはimplementation。)を使用してファイルの内容をインクルードする{$include ...}ため、Pascalファイル全体が定義を使用してコンパイルされ、次にそれらの定義を使用する他の部分的にインクルードされたファイルのコンテンツがコンパイルされます。 。きちんとした、ハッキー、醜い?わかりませんが、機能します:)

サンプルの記事では、型指定されたオブジェクトリスト(つまり、ではなく、などのリスト)が作成TObjectTMemoれます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サイトでより適切にフォーマットされています

幸運を!

于 2011-08-15T01:31:17.073 に答える