全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3654
推到 Plurk!
推到 Facebook!

想請問一下要找Tstringlist 裡其中一條string其中的一部分要怎樣做?

尚未結案
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-21 16:04:21 IP:218.103.xxx.xxx 未訂閱
我有一個Tstringlist 裡面很多string 我想找出其中一條string裡的data 的index 比如 : string[0] := 'AAAxxxxxx' string[1] := 'BBBxxxxxx' string[2] := 'CCCxxxxxx' string[3] := 'DDDxxxxxx' string[4] := 'AAAxxxxxx' 我想找出第一個BBB date開頭的位置 , xxxxxx 是固定的data 只有頭三個字母是固定的 我只想到可以用for loop , 但這樣好像會有點慢, 有類似memory access 的方法嗎? 謝謝 發表人 - samsam1230 於 2005/03/21 16:29:41
ebx
一般會員


發表:1
回覆:20
積分:9
註冊:2003-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-21 16:17:13 IP:219.93.xxx.xxx 未訂閱
for i := 1 to StringList.Count - 1 do if Pos('BBB', StringList.String[i]) = 1 then ShowMessageFmt('BBB is %n', [i]);
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-21 18:11:09 IP:220.244.xxx.xxx 未訂閱
假设: 1. 每條string是固定长度n 2. 每條string没有符号"(双引)    可以试试:
k := Pos('"BBB', stringlist.CommaText);    if k = 0 then
  没有;
else
  index := (k-1) div (n 3);
_________________________ Programming is a passion
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-22 11:18:57 IP:218.103.xxx.xxx 未訂閱
引言: 假设: 1. 每條string是固定长度n 2. 每條string没有符号"(双引) 可以试试:
k := Pos('"BBB', stringlist.CommaText);    if k = 0 then
  没有;
else
  index := (k-1) div (n 3);
_________________________ Programming is a passion
很不幸我的string 不是固定長度, 又有符号.... 哎...
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-22 21:58:54 IP:203.70.xxx.xxx 未訂閱
其實沒有很懂你的意思, 但TStringList有Sort, Find等指令。 先Sort後, 再Find"BBB", 它就會傳回Index。 如果你還要進一步判斷時, 你可以從這個Index值開始往後逐一檢查, 直到開頭不是"BBB"開頭...如此一來, 你檢查的資料筆數就能大幅減少。
var
  Str: TStringList;
  Index: Integer;
begin
  Str:=TStringList.Create;
  Str.Add('CCC1232141');
  Str.Add('AAA1232141');
  Str.Add('BBBB232141');
  Str.Add('AAA1232141');
  Str.Add('CASD232141');
  Str.Add('SDF1232141');
  Str.Add('DFC1232141');
  Str.Add('DDDD232141');
  Str.Add('DFSD232141');
  Str.Add('AFDS232141');
  Str.Sort;
  Str.Find('BBB', Index);
  ShowMessage(Str.Text);
  ShowMessage(IntToStr(Index));
  Str.Free;
end;
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-24 10:01:50 IP:218.103.xxx.xxx 未訂閱
謝謝yorkland的回答 但是我的Tstringlist 是不可以做sorting 的 因為, 是其他的用途 另外, AAA ,BBB, CCC 這些所有跟著後面都是不固定的, 連長度都不固定, 那怎麼辦呢? 謝謝
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-25 08:13:06 IP:220.244.xxx.xxx 未訂閱
SamSam1230, 你好,    你的data有一定特点, 但不足以帮你达到你的要求. 如果不是不可能的话, 要直接从stringlist中得到你要的index, 将是非常困难的.    换句话说, 需要做些辅助工作来帮你达到要求. 你可以试试给原有的stringlist建立一个indexlist(TStringList), 具有下面的对应关系.    
index     stringlist    indexlist
  0       AAAxxxxxx      AAA
  1       BBBxxxx        BBB
  2       CCCxxxxxxx     CCC
  3       BBBxxx         BBB
  ...     XXXxxxxx       XXX
两个list同步修改, 以保持对应关系. 比如,
   // add data
   stringlist.Add('DDDxxxxx');
   indexlist.Add('DDD');       stringlist.Insert(10, 'TTTxxxx');
   indexlist.Insert(10, 'TTT');       // delete data
   stringlist.Delete(15);
   indexlist.Delete(15);       // and so on...
indexlist满足我在上面post中提到的两个假设, 用上面的方法得到index, 将这个index用于stringlist, stringlist[index]就是你要的data. indexlist的data要比stringlist短, 搜索起来更快. 發表人 - yyu10 於 2005/03/25 08:21:38
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-25 15:33:39 IP:211.74.xxx.xxx 未訂閱
個人覺得...
使用Loop或許會比Pos好吧!?假設好了...
1.ABCDEFGHIJKLMNOPQRSTUVWXYZ
2. 1.ABC
   2.DEF
   3.GHI
   4.JKL...
如果要找個"JKL".....是不是以2來找比較好找呢!?因為1得從A....Z找,而2從1..2開始找起..
再做個範例..............:D
procedure TForm1.FormCreate(Sender: TObject); //建立一個資料庫
var i:Integer;
begin
  for i:=1 to 100000 do
    ListBox1.Items.Add(Format('"%d"',[i]));
end;    procedure TForm1.Button1Click(Sender: TObject); //測試1..使用Loop
var
  i:Integer;
  d:dword;
begin
  d:=timegettime;
  for i:=0 to ListBox1.Items.Count-1 do
    if ListBox1.Items[i]='"99999"' then begin
      Caption:=inttostr(i);
      Break;
    end;
  Showmessage(inttostr(timegettime-d));
end;    procedure TForm1.Button2Click(Sender: TObject); //測試二,使用Pos
var
  i:Integer;
  d:dword;
begin
  d:=timegettime;
  i:=Pos('"99999"',ListBox1.Items.Text);
  Caption:=inttostr(i);
  Showmessage(inttostr(timegettime-d));
end;    
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-25 15:50:50 IP:211.74.xxx.xxx 未訂閱
在則..除非資料數很多,才會覺得Loop會慢..或許得像yyu10前輩一樣,多做個
索引來!!But...
以下做個簡單的範例...
  Data:TStringList;存放資料
  List:TStringList;存放索引(可使用排序或自己搜尋存放位置)    procedure Insert;
var i,j:Integer;
begin
  j:=Data.Add('AAA12345');
  List.Find('AAA',i);  //如果使用sorted=true,則這就直接使用add方法!
  List.Insert(i,'AAA',Pointer(j)); //將Pointer當作Integer使用~:p
end;    procedure Delete;
var i,j:Integer;
begin
  if List.Find('AAA',i)then begin
    j:=Integer(List.Objects[i]);
    List.Delete(i);
    Data[j]:='';
  end;
end;    function Find(Str):Integer;
var i:Integer;
begin
  Result:=-1;
  if List.Find(Str,i)then 
    Result:=Integer(List.Objects[i]); //若找到測試index傳回!!
end;    
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-28 23:20:06 IP:210.201.xxx.xxx 未訂閱
StrUtils 的 AnsiStartsStr 函式應該是你的需求,這區分大小寫。 AnsiStartsText 不分大小寫。 看看Delphi 的 HELP 如何說吧。 function AnsiStartsStr(const ASubText, AText: string): Boolean; AnsiStartsStr returns true if the string specified by ASubText appears as the leading part of the string specified by AText. Comparison is performed case-sensitively. 即,如果 SText 的開頭剛好是 ASubText 字串,則傳回 true 。
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-29 09:55:55 IP:218.103.xxx.xxx 未訂閱
謝謝 yyu10 的方法 你的方法很好 我會試一下 也謝謝 jest0024
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-03-29 10:14:42 IP:218.103.xxx.xxx 未訂閱
謝謝 cancer
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-03-29 11:50:22 IP:218.103.xxx.xxx 未訂閱
但想一下 delphi 4.0 好像沒有這個function 可以call
ebx
一般會員


發表:1
回覆:20
積分:9
註冊:2003-10-09

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-03-30 09:20:47 IP:219.93.xxx.xxx 未訂閱
Try It  
procedure TForm1.Button1Click(Sender: TObject);
var
  Str: TStringList;
  Index: Integer;
  S: String;
  i: Integer;
begin
  Str := TStringList.Create;
  Str.Add('CCC1232141');
  Str.Add('AAA1232141');
  Str.Add('BBBB232141');
  Str.Add('AAA1232141');
  Str.Add('CASD232141');
  Str.Add('SDF1232141');
  Str.Add('DFC1232141');
  Str.Add('DDDD232141');
  Str.Add('DFSD232141');
  Str.Add('AFDS232141');
  Str.Delimiter := ',';
        S := Str.DelimitedText;
  ShowMessage(S);
  i := Pos('BBB', S);
  if i = 0 then
    ShowMessage('Not found !')
  else
  if i = 1 then
    ShowMessageFmt('Index is %d', [i])
  else
  begin
    Delete(S, i, Length(S));
    i := 0;        while LastDelimiter(',', S) <> 0 do
    begin
      Delete(S, LastDelimiter(',', S), Length(S));
      Inc(i);
    end;        ShowMessageFmt('Index is %d', [i   1]);
  end;
end;
系統時間:2024-07-01 5:53:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!