Algorithm 计数项目频率
您好,我正在使用Delphi,我有一个包含以下项目的StringList: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
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;
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
添加到使用列表中。@smashercode
使用…,泛型.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])+']';