non*_*one 10 delphi collections data-structures
当我处理Java问题时,我使用集合模式.但是,在Delphi中执行它是一个噩梦,因为没有Integer对象来处理事情.
我需要一个包含数字的数据结构.我希望能够添加数字,删除数字,并检查集合的内容,每个数字必须是唯一的.
我对自己需要实现和测试bug的解决方案不感兴趣.是否有像Java的HashTable这样的现成对象?
gab*_*abr 20
uses GpLists;
var
numberList: TGpIntegerList;
begin
numberList := TGpIntegerList.Create;
numberList.Duplicates := dupIgnore;
numberList.Sorted := true;
numberList.add(1);
numberList.add(2);
numberList.add(3);
numberList.add(1);
Run Code Online (Sandbox Code Playgroud)
GpLists附带BSD许可证.它还包含一个包含64位整数的类--TGpInt64List - 以及其他一些东西.
我知道它很脏,但你可能会误用TStringList(或THashedStringList).
var
numberList: TStringList;
begin
numberList := TStringList.Create;
numberList.Duplicates := dupIgnore;
numberList.Sorted := true;
numberList.add(IntToStr(1));
numberList.add(IntToStr(2));
numberList.add(IntToStr(3));
numberList.add(IntToStr(1));
// numberList.CommaText = '1,2,3'
Run Code Online (Sandbox Code Playgroud)
小智 6
Delphi容器类在"标准"VCL库中很差.这是一个长期存在的问题,仅在最新版本中得到部分纠正.如果您使用的是Delphi> = 2009,那么在您必须编写自己的类,以非标准方式使用TList或使用第三方库之前,您还可以处理整数数据类型的泛型类.如果你必须存储数字,如果它们最多32位长,你可以将它们存储在TList中,然后将它们与指针一起存储.您必须覆盖Add()方法以确保唯一性.您也可以使用TBits并将相应的"槽"设置为true.否则,您需要使用第三方库,例如JCL(免费)或DIContainers(商业).
小智 6
这是带有泛型的Delphi版本的简单解决方案:
TUniqueList<T> = class(TList<T>)
public
function Add(const Value: T): Integer;
end;
{ TUniqueList<T> }
function TUniqueList<T>.Add(const Value: T): Integer;
begin
if not Contains(Value) then
Result := inherited Add(Value);
end;
Run Code Online (Sandbox Code Playgroud)
如果具有大量整数的性能很重要,那么您可以保持列表排序并使用二进制序列