Есть ли HashSet в Delphi?Есть ли HashSet в Delphi?
Я знаю, что использование set can может содержать не более 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл
Есть ли HashSet в Delphi?Есть ли 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
.
AFAIK Delphi не включает реализацию HashSet, но вы можете попробовать проект [Spring4D] (https://bitbucket.org/sglienke/spring4d), который включает в себя 'THashSet', – RRUZ