计算项目频率

Pan*_*al. 10 delphi algorithm delphi-2009

嗨,我正在使用Delphi,我有一个带有以下项目的StringList:

45
A15
015
A15
A15
45
Run Code Online (Sandbox Code Playgroud)

我想处理它并制作第二个字符串列表,其中包含每个元素的外观数量:

45 [2]
015 [1]
A15 [3]
Run Code Online (Sandbox Code Playgroud)

我怎么能用Delphi做到这一点?

jpf*_*ius 10

你可以使用字典:

Frequencies := TDictionary <String, Integer>.Create;
try
  // Count frequencies
  for Str in StringList do
    begin
    if Frequencies.ContainsKey (Str) then
      Frequencies [Str] := Frequencies [Str] + 1
    else
      Frequencies.Add (Str, 1);
    end; 

   // Output results to console
   for Str in Frequencies.Keys do
     WriteLn (Str + ': ' + IntToStr (Frequencies [Str]));
finally
  FreeAndNil (Frequencies);
end;
Run Code Online (Sandbox Code Playgroud)

唯一的问题可能是结果出现的顺序完全是随机的,并且依赖于哈希映射的内部工作.

感谢daemon_x获取完整的单位代码:

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils, Classes, Generics.Collections;

var Str: String;
    StringList: TStrings;
    Frequencies: TDictionary <String, Integer>;

begin
  StringList := TStringList.Create;

  StringList.Add('45');
  StringList.Add('A15');
  StringList.Add('015');
  StringList.Add('A15');
  StringList.Add('A15');
  StringList.Add('45');

  Frequencies := TDictionary <String, Integer>.Create;

  try
  // Count frequencies
  for Str in StringList do
    begin
      if Frequencies.ContainsKey (Str) then
        Frequencies [Str] := Frequencies [Str] + 1
      else
        Frequencies.Add (Str, 1);
    end;

   // Output results to console
   for Str in Frequencies.Keys do
     WriteLn (Str + ': ' + IntToStr (Frequencies [Str]));

finally
  StringList.Free;
  FreeAndNil(Frequencies);
end;

end.
Run Code Online (Sandbox Code Playgroud)

  • @daemon_x:谢谢代码.我把它添加到了答案中. (2认同)