2011-06-08 51 views
10

嗨,我是使用Delphi和我有這個項的StringList:計數項目頻

45 
A15 
015 
A15 
A15 
45 

我要處理它,使將有 的每個元素的出現次數第二的StringList:

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

我該怎麼用Delphi來做到這一點?

+0

我希望我有這麼酷的功課,當我還是個孩子。 這是爲了好玩。 – 2011-06-08 17:17:31

回答

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; 

唯一的問題可能是在結果出現的順序完全是隨機的,並在哈希表的內部工作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. 
+1

@downvoter:你能解釋一下你的理由嗎?沒有理由的下調無助於任何人,也不是很公平,恕我直言。 – jpfollenius 2011-06-08 10:44:45

+0

@Smasher - 我是downvoter,因爲TD200在D2009中有一些問題。但我希望OP能夠更新它,所以我編輯了你的答案以便收回。當然這是一個好的和快速的解決方案,但是正如我記得在D2009中向TDictionary添加項目花了很長時間沒有更新。 – 2011-06-08 10:51:20

+0

@smasher。 謝謝你的幫助。我無法找到字典組件! 如何在Delphi 2009中使用此功能? – 2011-06-08 11:23:06

3

因爲我沒有德爾福截至目前已安裝的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; 
3
  1. 排序原始列表,

    list1.sort; 
    
  2. 創建一個新的列表

    list2:=TStringList.Create; 
    
  3. 遍歷排序列表來算每一個不同的項目 並存儲一個在結果列表的對象字段中計數(或者如果你不使用它,只是類型將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])+']';