我正在寻找一种有效的方法来检测数组中唯一值的数量。
我目前的做法:
在代码中:
yearHolder := '';
for I := 0 to High(yearArray) do
begin
currYear := yearArray[i];
if (yearHolder <> currYear) then
begin
yearHolder := currYear;
Inc(uniqueYearNumber);
end;
end;
答案 0 :(得分:6)
以下是THashedStringList:
的示例hl := THashedStringList.Create; // in Inifiles
try
hl.Sorted := True;
hl.Duplicates := dupIgnore; // ignores attempts to add duplicates
for i := 0 to High(yearArray) do
hl.Add(yearArray[i]);
uniqueYearCount := hl.Count;
finally
hl.Free;
end;
答案 1 :(得分:4)
通常,您可以使用此算法:
但是,在您的情况下,您的变量名为“year”。如果这真的是一年,这更简单,因为几年的范围非常有限。比如说,0-3000的范围应该足够了。因此,您可以使用简单的计数器数组,而不是哈希表。用0初始化它。然后当你看到2009年时,增加元素arr [2009]。最后,使用arr [i]&gt; = 1来计算元素的数量。
答案 2 :(得分:0)
与计划的微小偏差可能更值得:从不首先向数组添加重复项,或者将它们直接添加到建议的哈希数组中。
直到D2009,只有 THashedStringList (需要一堆昂贵的数字 - &gt;字符串转换和字符串上的哈希才能运行),但是如果你有D2009那么泛型.Collections 单元有一些有趣的数据结构。
答案 3 :(得分:0)
在使用DeHL的Delphi中,我们说: 列出uniqueWidgets:= List.Create(MassiveListOfNonUniqueWidgets.Distinct());
:P
答案 4 :(得分:-1)
我建议将这些项目添加到 Set ,并在完成后,读取生成的 Set 的大小。因为 Set 不允许重复,在Java,DDL,.Net和许多(如果不是所有语言)中,这是一种安全,廉价和可靠的方法。
答案 5 :(得分:-2)
更有效的算法是将所有内容转储为哈希表(不确定delphi是否有这个)。