2015-11-04 13 views
11

C'è un HashSet in Delphi?C'è un HashSet in Delphi?

So che l'utilizzo del set può contenere al massimo 255 articoli. Esiste un HashSet nell'ultimo compilatore Delphi, ad es. XE8, Seattle

+1

AFAIK Delphi non include un'implementazione HashSet, ma puoi provare il progetto [Spring4D] (https://bitbucket.org/sglienke/spring4d) che include un 'THashSet'. – RRUZ

risposta

10

Le raccolte standard non offrono una classe set generica. Le raccolte di raccolte di terze parti come Spring4D fanno.

È possibile creare facilmente una classe set generica su TDictionary<K, V>. Una versione ossa nude potrebbe essere simile a questo:

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; 

Non ho compilato questo codice, quindi potrebbe essere necessario per correggere eventuali errori che ho fatto. Probabilmente vorrai estenderlo per essere più capace. Ma spero che questo possa mostrarti come iniziare.

1

È possibile utilizzare TDictionary per quello. Definisci il parametro di tipo TKey come la cosa che desideri monitorare. Il parametro di tipo TValue può essere qualsiasi cosa; non lo userai. (Perl manca anche un set tipo, e così convenzione è quello di utilizzare la sua hash tipo nello stesso modo che sto suggerendo qui.)

chiamata ContainsKey per verificare l'appartenenza. Utilizzare Add o AddOrSetValue da inserire; Remove da eliminare.

Sarebbe un esercizio banale scrivere un wrapper che nasconde il parametro TValue inutilizzato.