哪个Delphi数据结构可以包含唯一整数列表?

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 - 以及其他一些东西.


Bar*_*lly 9

Dictionary<Integer,Boolean> 或类似的.


spl*_*ash 6

我知道它很脏,但你可能会误用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)

  • @none,实现自定义TIntegerList应该只需几分钟. (4认同)
  • 我只是使用TList而不是TStringList,将整数转换为指针.如果我有一个最近的Delphi版本(> = 2009),我可能会使用TList <Integer>. (3认同)

小智 6

Delphi容器类在"标准"VCL库中很差.这是一个长期存在的问题,仅在最新版本中得到部分纠正.如果您使用的是Delphi> = 2009,那么在您必须编写自己的类,以非标准方式使用TList或使用第三方库之前,您还可以处理整数数据类型的泛型类.如果你必须存储数字,如果它们最多32位长,你可以将它们存储在TList中,然后将它们与指针一起存储.您必须覆盖Add()方法以确保唯一性.您也可以使用TBits并将相应的"槽"设置为true.否则,您需要使用第三方库,例如JCL(免费)或DIContainers(商业).

  • 我认为实现一个整数列表容器是没有错的:TMyList = class(TObject)private List:TList; 结束; 并通过合适的添加/获取确保类型安全.公开内部列表会很愚蠢! (3认同)
  • 你会用你不知道的列表的指针进行内存调用吗?你需要的不仅仅是强类型语言......他不是在谈论在同一个列表中混合指针和整数(这会很糟糕). (2认同)

小智 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)

如果具有大量整数的性能很重要,那么您可以保持列表排序并使用二进制序列