線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5527
推到 Plurk!
推到 Facebook!

TstringList.sort結果有問題

答題得分者是:taishyang
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-06 14:20:36 IP:61.218.xxx.xxx 未訂閱
不知道大家有沒有發現,排序的結果很奇怪

a
a men
a.c
z

結果應該是a然後再a men,再來是a.c,最後是z,其他都很正常,唯獨只有空格和小數點等符號,排序的結果很奇怪,變成了

a men
a.c
a
z

明明a只有一個字元,排序卻在a後面還有其他字元的a men和a.c的後面,真的很奇怪!

哪位前輩可以指點一下,謝謝!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-06 14:54:49 IP:122.116.xxx.xxx 訂閱
我是用BCB,用下面的code來測試,排序的結果
是如你原本的預期,先a然後再a men再來是a.c最後是z
TStringList *sl = new TStringList;
sl->Add("a men");
sl->Add("a");
sl->Add("z");
sl->Add("a.c");
sl->Sort();
for (int i=0; i < sl->Count; i ){
Memo1->Lines->Add(sl->Strings[i]);
}
delete sl;
編輯記錄
taishyang 重新編輯於 2010-05-06 14:55:51, 註解 無‧
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-06 15:26:21 IP:61.218.xxx.xxx 未訂閱
感謝您熱心回覆,我發現我引用的數據並不正確,TstringList.sort沒有問題!

[code delphi]
ss:=TstringList.Create;
ss.Add('a|1');
ss.Add('a men|2');
ss.Add('a.c|3');
ss.Sort;
caption:=ss.Strings[0] ',' ss.Strings[1] ',' ss.Strings[2]

[/code]

我只要使用『|』號前的字串進行排序,請問有無較理想的做法,謝謝!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-06 15:36:04 IP:122.116.xxx.xxx 訂閱
利用substring把" | "之前的字串取出再排序可以嗎?


===================引 用 pcernet 文 章===================


我只要使用『|』號前的字串進行排序,請問有無較理想的做法,謝謝!
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-05-06 17:11:22 IP:61.218.xxx.xxx 未訂閱
感謝熱心答覆。

排序的結果不能改變TstringList裡的值,
看來要自行寫個排序程式了,希望效能不致於太差。

謝謝!
編輯記錄
pcernet 重新編輯於 2010-05-06 17:12:20, 註解 無‧
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-02-20 16:30:31 IP:122.126.xxx.xxx 訂閱
[code delphi]
type
TMySortData = class(TObject)
public
SIndex : String;
SRowData : String;
constructor Create(RowData : String);
end;

implementation
{ TMySortData }
constructor TMySortData.Create(RowData: String);
var
iPos : Integer;
begin
SRowData := RowData;
iPos := Pos('|', RowData);
if (iPos > 0) then
SIndex := Copy(RowData, 1, iPos - 1)
else
sIndex := RowData;
end;

//
var
I : Integer;
yourSortList : TStringList;;
data : TMySortData;
begin
yourSortList := TStringList;.Create;
yourSortList .OwnerObjects := True; // only for delphi 2009 or higher, delphi 2009之前要自行free TStringList內的Objects
try
// 加入清單
data := TMySortData.Create('a | 1');
yourSortList .AddObject(data.SIndex, data);
...
...
...
// 排序
yourSortList.Sort();

// 取出結果
for I:= 0 to yourSortList.Count - 1 do
begin
data := yourSortList.Objects[I] as TMySortData;
ShowMessage('sorted data ' data.SRowData);
end;

finally
FreeAndNil(yourSortList);
end;
[/code]

cancer
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-03-23 11:03:07 IP:211.75.xxx.xxx 未訂閱
TStringlist 每條字串的長度相同,排序才有意義。
數字排序,左邊先補零,排好後,再把零拿掉。
文字排序,右邊先補空格,排好後,再把空格拿掉。
系統時間:2024-03-29 6:29:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!