我用以下代码生成了一个TStringList类型的Strs,另有一个整型数组d 。其中d[i]与是Strs.Strings[i]相关的一个整数值。我的问题:怎样按照d[i]从小到大的顺序重新排列Strs的各项顺序。我知道TStringList的排序可以用Strs.Sorted:=true;但那好像是对Strs.Strings[i]而言的。不知Strs.AddObject()方法的第二个参数是干什么用的,能否用它通过某种形式来保存d[i]值并作为排序的依据。var
Strs:TStringList;procedure TForm1.Button1Click(Sender: TObject);
var
i,T:integer;
c:string;
d:array[0..9999] of integer;
begin
T:=GetTickCount;
randomize;
Strs:=TStringList.Create;
for i:=0 to 9999 do begin
c:=inttostr(random(99));
d[i]:=random(99);
Strs.Add(c);
end;
Form1.Caption:=floattostr((GetTickCount-T)/1000)+'秒';
RichEdit1.Text:=Strs.Text;
end;procedure TForm1.btnSortClick(Sender: TObject);
begin
Strs.Sorted:=true;
RichEdit1.Text:=Strs.Text;
end;如果TStringList本身不能实现以上功能,各位高手能否帮我写一个类似TStringList类的简化的类(TStringList的代码我看了,由于我初学Delphi功力尚浅一时未能消化),不要求它有TStringList那么多的属性和方法,主要能实现以下要求即可:类名:TMyStringList把TStringList中的记录结构
TStringItem = record
FString: string;
FObject: TObject;
end;
改为类似这样的记录结构,即包含一个整型域
TMyStringItem = record
FString: string;
FNum: integer;
end;把原Add方法改为下面这样:
function AddItem(const S: string;Num: integer): Integer; override;增加按FNum域的值大小来排序的方法SortByNum能够像下面这样为表项赋值:
Strs.Strings[i]:='abc';
Strs.Nums[i]:=30;
当然像 AddItem 那样带两个参数同时为两个域赋值也行Delete方法当然是必不可少的,其他方法如Find,Insert有没有都无所谓,有则更好。排序算法最好能像TStringList中一样,用快速排序。我手头没有算法和数据结构的书,希望能为代码加上必要的注释。
问题好像大了点,希望大家不怕麻烦帮一帮我这个新手。分数我有很多,但都是在VB版得到的。Delphi版我刚来,不知道对所发帖子的分数上限有什么规定。总之分不是问题。
Strs:TStringList;procedure TForm1.Button1Click(Sender: TObject);
var
i,T:integer;
c:string;
d:array[0..9999] of integer;
begin
T:=GetTickCount;
randomize;
Strs:=TStringList.Create;
for i:=0 to 9999 do begin
c:=inttostr(random(99));
d[i]:=random(99);
Strs.Add(c);
end;
Form1.Caption:=floattostr((GetTickCount-T)/1000)+'秒';
RichEdit1.Text:=Strs.Text;
end;procedure TForm1.btnSortClick(Sender: TObject);
begin
Strs.Sorted:=true;
RichEdit1.Text:=Strs.Text;
end;如果TStringList本身不能实现以上功能,各位高手能否帮我写一个类似TStringList类的简化的类(TStringList的代码我看了,由于我初学Delphi功力尚浅一时未能消化),不要求它有TStringList那么多的属性和方法,主要能实现以下要求即可:类名:TMyStringList把TStringList中的记录结构
TStringItem = record
FString: string;
FObject: TObject;
end;
改为类似这样的记录结构,即包含一个整型域
TMyStringItem = record
FString: string;
FNum: integer;
end;把原Add方法改为下面这样:
function AddItem(const S: string;Num: integer): Integer; override;增加按FNum域的值大小来排序的方法SortByNum能够像下面这样为表项赋值:
Strs.Strings[i]:='abc';
Strs.Nums[i]:=30;
当然像 AddItem 那样带两个参数同时为两个域赋值也行Delete方法当然是必不可少的,其他方法如Find,Insert有没有都无所谓,有则更好。排序算法最好能像TStringList中一样,用快速排序。我手头没有算法和数据结构的书,希望能为代码加上必要的注释。
问题好像大了点,希望大家不怕麻烦帮一帮我这个新手。分数我有很多,但都是在VB版得到的。Delphi版我刚来,不知道对所发帖子的分数上限有什么规定。总之分不是问题。
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;type
TForm2 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FStrings : TStringList;
public
{ Public declarations }
end;var
Form2: TForm2;implementationuses Unit1;{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);
var
i,a:integer;
str:string;
begin
FStrings.Sorted:=true;
RichEdit1.Lines.Assign(FStrings);
//RichEdit2.Lines.Clear;
//for i:=0 to RichEdit1.Lines.Count-1 do
for i:= 0 to FStrings.Count-1 do
begin
//从对象中获取整型数据
a := integer(FStrings.Objects[i]);
RichEdit2.Lines.Append(FStrings.Strings[i] +':'+inttostr(a));
end;
end;procedure TForm2.FormCreate(Sender: TObject);
var
i,T:integer;
c:string;
begin
T:=GetTickCount;
randomize;
FStrings := TStringList.Create;
FStrings.Clear;
for i:=0 to 9999 do
begin
c := inttostr(random(99));
//将整型数据以对象形式存储。
FStrings.AddObject(c,Tobject(random(99)));
end;
Form1.Caption:=floattostr((GetTickCount-T)/1000)+'秒';
RichEdit1.Lines.Assign(FStrings);
end;procedure TForm2.FormDestroy(Sender: TObject);
begin
FStrings.Free;
end;
你给的代码只是演示了如何使FStrings.AddObject()方法的第二个参数为整数,但是并没有利用第二个参数值来排序。我主要是想知道怎样利用数组d的值来为FStrings排序,或者TStringList有没有现成的利用第二个参数值来排序方法。
我把Delphi带的线程例子里的快速排序函数改了一下,速度还可以接受。
先不给分,再等一两天,希望高手们提出更好的方法。
第一列填为顺序号,第二列为d内容。按第二列排好序后,把第一列作为itemindex把数据复制到一个新的stringlist,free掉原stringlist.