2015-11-04 24 views
11

Delphi'de bir HashSet var mı?Delphi'de bir HashSet var mı?

En fazla 255 ürün için set can kullanıyorum. En son Delphi Derleyicisinde bir HashSet var mı? XE8, Seattle

+1

AFAIK Delphi bir HashSet uygulaması içermez, ancak bir THashSet içeren [Spring4D] (https://bitbucket.org/sglienke/spring4d) projesini deneyebilirsiniz. – RRUZ

cevap

10

Standart koleksiyonlar genel bir grup sınıfı sunmaz. Spring4D gibi üçüncü parti koleksiyon kütüphaneleri yapar.

Genel bir ayar sınıfı TDictionary<K, V> üstünde oldukça kolay bir şekilde oluşturabilirsiniz. Bir çıplak kemikleri sürümü bu gibi görünebilir: Eğer benim yaptığım yanlışlıkları düzeltmeleri gerekebilir böylece

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; 

Ben, bu kodu derlenmiş ettik. Daha yetenekli olmak için onu genişletmek isteyeceksiniz. Ama umarım bu size nasıl başlayacağınızı gösterir.

1

Bunun için TDictionary kullanabilirsiniz. İzlemek istediğiniz şey olmak için TKey tip parametresini tanımlayın. TValue tip parametresi herhangi bir şey olabilir; kullanmayacaksın. (Perl ayrıca seti türünü yoksun ve böylece kongre Burada önerdiğim şey aynı şekilde onun karma türünü kullanmaktır.)

Çağrı ContainsKey üyeliğini kontrol etmesi. Eklemek için Add veya AddOrSetValue kullanın; Silmek için Remove.

Kullanılmayan TValue parametresini gizleyen bir sarıcı yazmak önemli bir alıştırma olacaktır.