Есть ли HashSet в Delphi?

Есть ли HashSet в Delphi?

Я знаю, что использование set can может содержать 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл

Ответ 1

Стандартные коллекции не предлагают общий набор классов. Библиотеки сторонних коллекций, такие как 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;

Я не компилировал этот код, поэтому вам, возможно, придется исправить любые ошибки, которые я сделал. Вы, скорее всего, захотите расширить его, чтобы быть более способным. Но, надеюсь, это может показать вам, как начать.

Ответ 2

Вы можете использовать TDictionary. Определите параметр типа TKey, который вы хотите отслеживать. Параметр TValue может быть любым; вы не будете использовать его. (Perl также не имеет заданного типа, и поэтому соглашение должно использовать его хэш-тип таким же образом, как я предлагаю здесь.)

Вызовите ContainsKey, чтобы проверить членство. Используйте Add или AddOrSetValue для вставки; Remove для удаления.

Было бы тривиальным упражнением написать оболочку, которая скрывает неиспользуемый параметр TValue.