Есть ли HashSet в Delphi?
Я знаю, что использование set can может содержать 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл
Есть ли HashSet в Delphi?
Я знаю, что использование set can может содержать 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл
Стандартные коллекции не предлагают общий набор классов. Библиотеки сторонних коллекций, такие как 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;
Я не компилировал этот код, поэтому вам, возможно, придется исправить любые ошибки, которые я сделал. Вы, скорее всего, захотите расширить его, чтобы быть более способным. Но, надеюсь, это может показать вам, как начать.
Вы можете использовать TDictionary
. Определите параметр типа TKey
, который вы хотите отслеживать. Параметр TValue
может быть любым; вы не будете использовать его. (Perl также не имеет заданного типа, и поэтому соглашение должно использовать его хэш-тип таким же образом, как я предлагаю здесь.)
Вызовите ContainsKey
, чтобы проверить членство. Используйте Add
или AddOrSetValue
для вставки; Remove
для удаления.
Было бы тривиальным упражнением написать оболочку, которая скрывает неиспользуемый параметр TValue
.