代码之家  ›  专栏  ›  技术社区  ›  none

哪个Delphi数据结构可以保存唯一整数列表?

  •  9
  • none  · 技术社区  · 14 年前

    当我处理Java问题时,我使用集合模式。然而,在Delphi中这样做是一场噩梦,因为没有整数对象来处理事情。

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

    我对一个需要自己实现和测试bug的解决方案不感兴趣。是否有一个现成的对象,比如Java的哈希表?

    9 回复  |  直到 14 年前
        1
  •  6
  •   splash    14 年前

    我知道它很脏,但你可以误用 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'
    
        2
  •  20
  •   gabr    14 年前
    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)和一堆其他东西。

        3
  •  9
  •   Barry Kelly    14 年前

    Dictionary<Integer,Boolean> 或者类似的事情。

        4
  •  6
  •   user160694    14 年前

    “标准”VCL库中的Delphi容器类较差。这是一个长期存在的问题,在最新版本中只有部分更正。 如果您使用的是Delphi>=2009,那么在必须编写自己的类、以非标准方式使用tlist或使用第三方库之前,您还可以使用能够处理整数数据类型的泛型类。 如果必须存储数字,如果它们的长度不超过32位,则可以将它们存储在tlist中,并在指针之间强制转换。必须重写add()方法以确保唯一性。您也可以使用tbits并将相应的“slot”设置为true。 否则,您需要使用第三方库,如 JCL (免费)或 DIContainers (商业),例如。

        5
  •  6
  •   Martijn van der Kooij    12 年前

    这是一个简单的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;
    

    如果大量整数的性能很重要,那么可以对列表进行排序并使用二进制SERCH

        6
  •  4
  •   Toby Allen mercator    14 年前

    可以使用tlist存储一组整数。它应该存储指针,但是由于指针只是整数,所以在存储整数时它工作得很好。

        7
  •  1
  •   Linas    14 年前

    我个人强烈建议开始使用 DeCAL 用于存储数据。它有一个dmap容器,可以处理几乎任何数据类型,它是自优化的,因为它使用内部红黑树,并且不允许添加重复项(如果需要插入重复项,可以使用dmultimap)。dmap的另一个优点是在列表中查找元素的速度非常快(比tstringlist快得多)。与其他Delphi库相比,使用decal有点不同,但是一旦您熟悉了它,就不会在代码中使用任何字符串列表。

    编辑:已启用旧版本的贴花 SourceForge 但是在这里你可以找到很好的PDF手册。

        8
  •  1
  •   Schnider    14 年前

    Delphi有Unit MxArrays(Decision Cube),有一个类TintArray,将它的属性Duplicates设置为DupIgnore。它还可以对值进行排序。如果您要使用它,请参见 Quality Central Report #:2703 纠正此单元中的错误。

        9
  •  0
  •   radu122    11 年前

    是的,有,它叫 TDictionary