對一個MEMO中的欄位處理 VCL組件開發及應用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061224223945142.html
有一個memo裡內容如下:1,2,8,2,6,3,3,2,8,2,5,2,10,4,1,1,3,4,2,3,2,9,2,1,8,1,2,4,4,11,1,7
,6,5,6,1,1,1,2,2,6,4,2,1,6,1,5,6,2,1,1,2,4,4,2,3,2,6,1,3,2,8,1,1,4
,3,4,8,3,6,2,1,
現在想達到以下目的:
1、統計其中所出現的數字以及數字出現的次數;
2、相同數字連出的次數;比如上面的1:
1,2,1,1,1,3,1,1,2,1,2,1類似這樣的;
該如何處理,高手求救!!!
1、統計其中所出現的數字以及數字出現的次數
//ButtonSum: TButton; 統計
//MemoSrc: TMemo; 源Memo
//MemoSum: TMemo; 顯示統計資訊用
procedure TForm1.ButtonSumClick(Sender: TObject);
var
Str , S : String;
SList : TStringList;
I , Sum : integer;
begin
Str := MemoSrc.Text;
SList := TStringList.Create;
SList.Text := StringReplace( Str, ',' , #10 , [rfReplaceAll] );
SList.Sort;
S := SList[0];
Sum := 1;
for I := 1 to SList.Count-1 do
if S <> SList[I] then
begin
memoSum.Lines.Add(S + ' : ' + IntToStr(Sum) +' 個');
S := SList[I];
Sum :=1;
end else Inc(Sum);
SList.Free;
end;
2、相同數字連出的次數
沒弄明白。
不好意思,上面的代碼裡,在 SList.Free; 這句前面,還要加一句:
memoSum.Lines.Add(S + ' : ' + IntToStr(Sum) +' 個');
謝謝帥哥的支援,第二個問題的意思是這樣的,在整個數字中有許多個1,2,3等,那麼這些相同數字有時是連著出的,像1,1這樣,現在就統計這些數字連出的次數,要是沒有連,就是1,要是連了,連幾次就是幾次:1,2,8,2,6,3,3,2,8,2,5,2,10,4,1,1,3,4,2,3,2,9,2,1,8,1,2,4,4,11,1,7
,6,5,6,1,1,1,2,2,6,4,2,1,6,1,5,6,2,1,1,2,4,4,2,3,2,6,1,3,2,8,1,1,4
,3,4,8,3,6,2,1,
上面的1:第一次的1,是1,2,8..沒有連,第二次和第三次出現的1就連了,4,1,1,3,第四次和第五、六次都沒連,後面又連了3次,1,1,1,。所以這幾次統計結果就是:1,2,1,1,1,3...如此類推
我們在剛學C語言的時候就經常做這樣的演算法,很簡單
1、統計其中所出現的數字以及數字出現的次數;
定義一個2維integer動態數組, 其數組的長度為這串數位最大值。
setlength(intArr,MaxValue); 這裡好像是11,
所以就是 intarr[11,2],初始化所有的數組為一個預設值,這個預設值必須是memo中沒有的數字!我們姑且初始化為0,1列可以不是,2列必須為0,這是用來計算個數的
然後遍曆這些數字,
遍曆之前對memo裡的數字進行格式化,
加入另一個memo 或者定義一個Tstrings類型的變數
S:=TStrings.Create;
S.Delimiter:=',';
S.DelimitedText:=Memo.text;
....
S.Free; //最後執行
For I:=1 to S.count-2 do //減2是應為最後一個字元是,所以格式化之後最後一個元素是空!
begin
intArr[Strtoint(S.strings[I]),0]:=S.strings[I])
intArr[Strtoint(S.strings[I]),1]:=intArr[Strtoint(S.strings[I]),1]+1;
end;
2、相同數字連出的次數
這個統計則是另外的演算法了,
對memo裡的字元進行格式化,還是必須的
加入另一個memo 或者定義一個TstringList類型的變數
S:=TStringList.Create;
S.Delimiter:=',';
S.DelimitedText:=Memo.text;
S.short;//對其排序
定義一個數組儲存統計結果:intArr[X,2], 數組的行數為元素的個數,也就是S的Count-2,最終是用不到這麼多的,列分為2列, 1列儲存元素,2列儲存出現次數
定義一個字串變數 Str:=''; //中轉字元,用來查看相鄰元素之間是否相同
定義一個integer變數 index:=0; //用來標示統計到哪個元素的下標!
For I:=0 to S.Count-2 do
begin
if Str=S.Strings[I] then
begin
intArr[Index,1]:=intArr[Index,1]+1;
end
else begin
index:=index+1;
Str:=S.strings[I];
intArr[Index,0]:=StrToInt(S.Strings[I]);
intArr[Index,1]:=0;
end;
end;
S.Free;
不好意思,第2個問題,不需要排序!
謝謝二位,我覺得lihuasoft(學習低調做人) 的方法比較好,簡單一些,winxkm(蹩腳的程式員)的方法用到動態二維數組,比較麻煩,第二個問題我自己解決了,謝謝二位!!