對一個MEMO中的欄位處理

來源:互聯網
上載者:User
對一個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(蹩腳的程式員)的方法用到動態二維數組,比較麻煩,第二個問題我自己解決了,謝謝二位!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.