理解IntegerList上的TDictionary

时间:2014-02-02 08:07:30

标签: delphi

我可以直接在TList类上创建TDictionary吗?如果我使用键创建我的TDictionary类并且值总是与BlackList.Add(1,1)相同的数据,它看起来有点双重工作;

var
  BlackList: TDictionary<Integer, Integer>;
  ResultList: TDictionary<Integer, Integer>;
  TestListA: TLIst<Integer>;
  TestListB: TLIst<Integer>;
  i: Integer;
begin
  BlackList.Add(1, 1);
  BlackList.Add(2, 2);

  for i := 0 to TestListA.Count - 1 do
  begin
    if BlackList.ContainsValue(TestListA[i]) then
    begin
      // no action ...
    end
    else
    begin
      ResultList.Add(i, TestListA[i]);
    end;
  end;

  for i := 0 to TestListB.Count - 1 do
  begin
    if BlackList.ContainsValue(TestListB[i]) then
    begin
      // no action ...
    end
    else
    begin
      if not(ResultList.ContainsValue(TestListB[i])) then
        ResultList.Add(i, TestListB[i]);

    end;
  end;
end;

此算法的目的是比较2个整数列表,查找所有双精度但排除黑名单中的数字。第一个q在这里Find common elements in two Integer List

1 个答案:

答案 0 :(得分:3)

在此特定代码中,使用TDictionary的全部目的是利用O(1)查找。对于TList,这是一个数组,您没有该属性。查找通常为O(n),如果排序则为O(log n)。因此,您无法通过任何方式从TList中提取O(1)查找性能,因此使用TDictionary

因此推动使用TDictionary的是表现动机。正如我在上一个问题中所说,如果列表很大,设置字典的开销是值得的。你需要做一些基准测试来量化这种背景下的大手段。

至于你的字典,使用什么值并不重要,因为只有键很重要。所以总是使用零。理想情况下,您需要的是基于与字典相同算法的哈希集类型。但我不相信股票RTL中存在这样的事情。我希望像Spring4D这样的库提供这种功能。