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

时间:2010-10-12 11:57:53

标签: delphi data-structures collections

当我处理Java问题时,我使用了集合模式。但是,在Delphi中执行它是一个噩梦,因为没有Integer对象来处理事情。

我需要一个包含数字的数据结构。我希望能够添加数字,删除数字,并检查集合的内容,每个数字必须是唯一的。

我对自己需要实现和测试bug的解决方案不感兴趣。是否有像Java的HashTable这样的现成对象?

9 个答案:

答案 0 :(得分: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);

GpLists附带BSD许可证。它还包含一个包含64位整数的类--TGpInt64List - 以及其他一些东西。

答案 1 :(得分:9)

Dictionary<Integer,Boolean>或类似的。

答案 2 :(得分: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'

答案 3 :(得分:6)

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

答案 4 :(得分: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;

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

答案 5 :(得分:4)

您可以使用TList存储一组整数。它应该存储指针,但由于指针只是整数,因此在存储整数时效果非常好。

答案 6 :(得分:1)

就个人而言,我强烈建议您开始使用DeCAL来存储数据。它有DMap容器​​,可以处理几乎任何数据类型,自我优化,因为它使用内部红黑树,它不允许你添加重复项(如果你需要插入重复项,你可以使用DMultiMap)。 DMap的另一个好处是列表中的查找元素非常快(比TStringList快得多)。使用DeCal与使用其他Delphi库有点不同,但是一旦熟悉它,就不会在代码中使用任何StringList。

编辑:旧版DeCAL位于SourceForge,但您可以在这里找到精彩的pdf手册。

答案 7 :(得分:1)

Delphi有单元mxarrays(Decision Cube),有一个类TIntArray,设置它的属性Duplicates到dupIgnore。它也可以对值进行排序。如果您将使用它,请参阅Quality Central Report #:2703以更正本机中的错误。

答案 8 :(得分:0)

是的,有,它被称为TDictionary