嗨,我是使用Delphi和我有這個項的StringList:計數項目頻
45
A15
015
A15
A15
45
我要處理它,使將有 的每個元素的出現次數第二的StringList:
45 [2]
015 [1]
A15 [3]
我該怎麼用Delphi來做到這一點?
嗨,我是使用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;
唯一的問題可能是在結果出現的順序完全是隨機的,並在哈希表的內部工作dependes。
感謝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.
@downvoter:你能解釋一下你的理由嗎?沒有理由的下調無助於任何人,也不是很公平,恕我直言。 – jpfollenius 2011-06-08 10:44:45
@Smasher - 我是downvoter,因爲TD200在D2009中有一些問題。但我希望OP能夠更新它,所以我編輯了你的答案以便收回。當然這是一個好的和快速的解決方案,但是正如我記得在D2009中向TDictionary添加項目花了很長時間沒有更新。 – 2011-06-08 10:51:20
@smasher。 謝謝你的幫助。我無法找到字典組件! 如何在Delphi 2009中使用此功能? – 2011-06-08 11:23:06
因爲我沒有德爾福截至目前已安裝的I編碼這個在我的頭上。讓我知道它是如何爲你工作的。 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;
遍歷排序列表來算每一個不同的項目 並存儲一個在結果列表的對象字段中計數(或者如果你不使用它,只是類型將count存入指針並將其作爲對象存儲)。
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])+']';
我希望我有這麼酷的功課,當我還是個孩子。 這是爲了好玩。 – 2011-06-08 17:17:31