我可以直接在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。
答案 0 :(得分:3)
在此特定代码中,使用TDictionary
的全部目的是利用O(1)查找。对于TList
,这是一个数组,您没有该属性。查找通常为O(n),如果排序则为O(log n)。因此,您无法通过任何方式从TList
中提取O(1)查找性能,因此使用TDictionary
。
因此推动使用TDictionary
的是表现动机。正如我在上一个问题中所说,如果列表很大,设置字典的开销是值得的。你需要做一些基准测试来量化这种背景下的大手段。
至于你的字典,使用什么值并不重要,因为只有键很重要。所以总是使用零。理想情况下,您需要的是基于与字典相同算法的哈希集类型。但我不相信股票RTL中存在这样的事情。我希望像Spring4D这样的库提供这种功能。