当我处理Java问题时,我使用了集合模式。但是,在Delphi中执行它是一个噩梦,因为没有Integer对象来处理事情。
我需要一个包含数字的数据结构。我希望能够添加数字,删除数字,并检查集合的内容,每个数字必须是唯一的。
我对自己需要实现和测试bug的解决方案不感兴趣。是否有像Java的HashTable这样的现成对象?
答案 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