2015-11-04 14 views
11

DelphiにHashSetがありますか?DelphiにHashSetがありますか?

私は知っているセットを使用することができます知っているほとんど255アイテムを保持します。最新のDelphiコンパイラにはHashSetがありますか? XE8、シアトル

+1

AFAIK DelphiにはHashSet実装は含まれていませんが、[Spring4D](https://bitbucket.org/sglienke/spring4d)プロジェクトでは、 'THashSet' – RRUZ

答えて

10

標準のコレクションでは、一般的なセットクラスは提供されていません。 Spring4Dのようなサードパーティのコレクションライブラリはそうします。

TDictionary<K, V>の上に汎用セットクラスを簡単に作成できます。裸の骨のバージョンは次のようになります。あなたは私が作った間違いを修正する必要があるかもしれませんので、

type 
    TSet<T> = class 
    private 
    FDict: TDictionary<T, Integer>; 
    public 
    constructor Create; 
    destructor Destroy; override; 
    function Contains(const Value: T): Boolean; 
    procedure Include(const Value: T); 
    procedure Exclude(const Value: T); 
    end; 

.... 

constructor TSet<T>.Create; 
begin 
    inherited; 
    FDict := TDictionary<T, Integer>.Create; 
end; 

destructor TSet<T>.Destroy; 
begin 
    FDict.Free; 
    inherited; 
end; 

function TSet<T>.Contains(const Value: T): Boolean; 
begin 
    Result := FDict.ContainsKey(Value); 
end; 

procedure TSet<T>.Include(const Value: T); 
begin 
    FDict.AddOrSetValue(Value, 0); 
end; 

procedure TSet<T>.Exclude(const Value: T); 
begin 
    FDict.Remove(Value); 
end; 

私は、このコードをコンパイルしていませんでした。もっと能力を伸ばすためにそれを拡張したいと思うでしょう。しかし、うまくいけば、これは始める方法を示すことができます。

1

これにはTDictionaryを使用できます。 TKeyタイプのパラメータをトラッキングするものとして定義します。 TValueタイプのパラメータは何でもかまいません。あなたはそれを使用しません。 (Perlはまたセット種類を欠いて、その大会は、私がここに示唆しています同様にそのハッシュタイプを使用することです。)

コールContainsKeyは、メンバーシップを確認すること。挿入にはAddまたはAddOrSetValueを使用してください。 Removeを削除してください。

未使用のTValueパラメータを隠すラッパーを書くのは簡単なことです。