检测数组中唯一值的数量

时间:2009-06-12 19:55:02

标签: delphi data-structures

我正在寻找一种有效的方法来检测数组中唯一值的数量。

我目前的做法:

  1. Quicksort整数数组
  2. 然后运行循环来比较元素。
  3. 在代码中:

      yearHolder := '';
      for I := 0 to  High(yearArray) do
      begin
        currYear := yearArray[i];
        if (yearHolder <> currYear) then
        begin
          yearHolder := currYear;
          Inc(uniqueYearNumber);
        end;
      end;
    

6 个答案:

答案 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)

通常,您可以使用此算法:

  1. 创建一个哈希表,将年份映射到出现次数。
  2. 对于数组中的每个数字,将相应的条目放在哈希表中。
  3. 完成后,获取哈希值中的条目数。
  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是否有这个)。

  1. 遍历列表(在本例中为yearArray)并将值用作哈希表中的键。
  2. 检索哈希表中的键数。