嗨,我正在使用Delphi,我有一个包含以下项目的StringList:
45
A15
015
A15
A15
45
我想处理它,并制作第二个字符串每个元素的出现次数:
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;
唯一的问题可能是结果出现的顺序是完全随机的,并且取决于哈希图的内部工作。
感谢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.
-
对原始列表进行排序,
list1.sort;
-
创建一个新的列表
list2:=TStringList.Create;
-
迭代排序列表以计数每个不同的项目并将a计数存储在结果列表的objects字段中(或者,如果您还没有使用它,只需将计数键入指针并将其存储为对象)。
previtem:=list1[0]; count:=1; for i:=1 to list1.count-1 do begin if list1[i]=previtem then inc(count) else begin list2.addObject(previtem,pointer(count)); previtem:=list1[i]; count:=1; end; end; list2.addObject(previtem,pointer(count));
最后,再次迭代,将计数添加到字符串中
for i:=0 to list2.count-1 do
list2.items[i]:=list2[i]+' ['+inttostr(list2.objects[i])+']';
我在脑子里编码了这个,因为我现在还没有安装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;