Algorithm 计数项目频率

Algorithm 计数项目频率,algorithm,delphi,delphi-2009,Algorithm,Delphi,Delphi 2009,您好,我正在使用Delphi,我有一个包含以下项目的StringList: 45 A15 015 A15 A15 45 我想处理它并制作第二个stringlist,它将 每个元素的外观数: 45 [2] 015 [1] A15 [3] 如何使用Delphi实现这一点?您可以使用字典: Frequencies := TDictionary <String, Integer>.Create; try // Count frequencies for Str in String

您好,我正在使用Delphi,我有一个包含以下项目的StringList:

45
A15
015
A15
A15
45
我想处理它并制作第二个stringlist,它将 每个元素的外观数:

45 [2]
015 [1]
A15 [3]

如何使用Delphi实现这一点?

您可以使用字典:

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;
频率:=t字典。创建;
尝试
//计数频率
对于StringList中的Str,请执行以下操作:
开始
如果频率包含SKEY(Str),则
频率[Str]:=频率[Str]+1
其他的
增加(Str,1);
结束;
//将结果输出到控制台
对于频率中的Str。按键可以
WriteLn(Str+':'+IntToStr(频率[Str]);
最后
FreeAndNil(频率);
结束;
唯一的问题可能是结果的显示顺序完全是随机的,并且取决于哈希映射的内部工作

感谢提供完整的单元代码:

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.
程序项目1;
{$APPTYPE控制台}
使用SysUtils、类、泛型;
var-Str:String;
字符串列表:TStrings;
频率:t字典;
开始
StringList:=TStringList.Create;
添加('45');
StringList.Add('A15');
StringList.Add('015');
StringList.Add('A15');
StringList.Add('A15');
添加('45');
频率:=t字典。创建;
尝试
//计数频率
对于StringList中的Str,请执行以下操作:
开始
如果频率包含SKEY(Str),则
频率[Str]:=频率[Str]+1
其他的
增加(Str,1);
结束;
//将结果输出到控制台
对于频率中的Str。按键可以
WriteLn(Str+':'+IntToStr(频率[Str]);
最后
StringList.Free;
FreeAndNil(频率);
结束;
结束。

由于目前还没有安装Delphi,所以我将其编码在我的头上。让我知道它是如何为你工作的。 Stringlist1是包含项的原始列表,stringlist2为空,将用于存储所需内容

for i := 0 to stringlist1.Count - 1 do
begin
    if (stringlist2.Values[stringlist1[i]] = '') then
        stringlist2.Values[stringlist1[i]] := '1'
    else
        stringlist2.Values[stringlist1[i]] :=
            IntToStr(StrToInt(stringlist2.Values[stringlist1[i]]) + 1);
end;
  • 对原始列表进行排序

    list1.sort;
    
  • 创建一个新列表

    list2:=TStringList.Create;
    
  • 迭代排序列表以计算每个不同的项 并将a计数存储在结果列表的“对象”字段中(或者,如果您尚未使用它,只需将计数键入指针并将其存储为对象)

  • 最后,再次迭代以将计数添加到字符串中

      for i:=0 to list2.count-1 do
        list2.items[i]:=list2[i]+' ['+inttostr(list2.objects[i])+']';
    

    @选民:你能解释一下你的理由吗?没有理由的否决票对任何人都没有帮助,也不是很公平。斯玛什-我是否决票的人,因为2009年的D2词典中出现了一些问题。但我希望OP有更新,所以我编辑了你的答案,把它收回。当然,这是一个好的、快速的解决方案,但正如我记得的,在D2009中向TDictionary添加项目花费了很长时间而没有更新。谢谢你的帮助。我找不到字典组件!如何在Delphi 2009中使用它?只需将
    泛型.Collections
    添加到使用列表中。@smasher
    code
    使用…,泛型.Collections;类型频率=t字典;尝试//计算FL do中Str的频率//如果频率。ContainsKey(Str)then//表达式预期频率[Str]:=频率[Str]+1其他频率,则无法将左侧指定为开始。添加(Str,1);完将Str的结果以频率输出到控制台。键不写(Str+':'+IntToStr(频率[Str]);最后是FreeAndNil(频率);结束<代码>代码我犯了很多错误我希望我小时候有这么酷的作业。这是为了好玩。
      for i:=0 to list2.count-1 do
        list2.items[i]:=list2[i]+' ['+inttostr(list2.objects[i])+']';