2015-11-04 4 views
11

Есть ли HashSet в Delphi?Есть ли HashSet в Delphi?

Я знаю, что использование set can может содержать не более 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. 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.

Смежные вопросы