想請問一下要找Tstringlist 裡其中一條string其中的一部分要怎樣做? |
尚未結案
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
我有一個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 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
yorkland
高階會員 發表:2 回覆:138 積分:108 註冊:2004-12-17 發送簡訊給我 |
其實沒有很懂你的意思, 但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 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
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 發送簡訊給我 |
個人覺得... 使用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 發送簡訊給我 |
在則..除非資料數很多,才會覺得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 發送簡訊給我 |
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 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
ebx
一般會員 發表:1 回覆:20 積分:9 註冊:2003-10-09 發送簡訊給我 |
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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |