对一个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(蹩脚的程序员)的方法用到动态二维数组,比较麻烦,第二个问题我自己解决了,谢谢二位!!