delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
对一个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(蹩脚的程序员)的方法用到动态二维数组,比较麻烦,第二个问题我自己解决了,谢谢二位!!

posted on 2008-09-19 13:44 delphi2007 阅读(283) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。