本文章来源于一个网友的提问如下:
我有一些数据,保存在tlist中,每项是个结构,如何在对一项排序的基础上,继续排序
排序前
张三 男 25
王婆 女 24
李四 男 32
王婆2 女 27
王二 男 28
排序以后
张三 男 25
王二 男 28
李四 男 32
王婆 女 24
王婆2 女 27
现在整理一下,从新提出来,希望给初学者一点帮助,通过分析
既然是要排序,那么要排的东西应该可以转换为字符串,既然可以转换为字符串,那么我们就可以通过将所有要排的字段全部转换为字符串之后合并为一个字符串,然后比较这个合并后的字符串进行排序则可 ,所以我们可以定义一个函数如下:
procedure Sort(List: TList;isArc: boolean); {isArc指定是升序还是降序} var i,j: integer; people,People2,temp: pPeoPle; tempstr1,tempstr2: string; begin for i := 0 to List.Count - 1 do begin for j := i + 1 to List.Count - 1 do begin People := List.Items[i]; tempstr1 := people^.Name + ' ' + people^.Sex + ' ' + inttostr(people^.Age); people2 := List.Items[j]; tempstr2 := people2^.Name + ' '+ people2^.Sex + ' ' + inttostr(people2^.Age); if ((isArc) and (CompareStr(tempstr1,tempstr2) >0)) or((not isarc) and (CompareStr(tempstr1,tempstr2) <0))then begin temp := List.Items[i]; List.Items[i] := list.Items[j]; List.Items[j] := temp; end; end; end; end; |
整体程序测试代码如下:
正个程序的测试代码如下:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type pPeople = ^TPeople; TPeople = packed record Name: string; Sex: string; Age: integer; end; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; procedure FormCreate(Sender: TObject); function GetPeople(PeopleName,Sex: string;Age: integer): pPeople; procedure Button1Click(Sender: TObject); private { Private declarations } List: TList; //procedure Sort(); procedure FillMem(Memo: Tmemo); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var People: pPeople; begin List := TList.Create; People := GetPeople( '张三 ', '男 ',25); List.Add(People); People := GetPeople( '王婆 ', '女 ',24); List.Add(People); People := GetPeople( '李四 ', '男 ',32); List.Add(People); People := GetPeople( '王婆2 ', '女 ',45); List.Add(People); People := GetPeople( '王二 ', '男 ',28); List.Add(People); People := GetPeople( '测试人 ', '男 ',22); List.Add(People); People := GetPeople( '王婆 ', '女 ',22); List.Add(People); fillmem(memo1); end; function TForm1.GetPeople(PeopleName, Sex: string; Age: integer): pPeople; var People: pPeople; begin new(People); People^.Name := PeopleName; People^.Sex := Sex; People^.Age := Age; result := People; end; procedure Sort(List: TList;isArc: boolean); var i,j: integer; people,People2,temp: pPeoPle; tempstr1,tempstr2: string; begin for i := 0 to List.Count - 1 do begin for j := i + 1 to List.Count - 1 do begin People := List.Items[i]; tempstr1 := people^.Name + ' ' + people^.Sex + ' ' + inttostr(people^.Age); people2 := List.Items[j]; tempstr2 := people2^.Name + ' '+ people2^.Sex + ' ' + inttostr(people2^.Age); if ((isArc) and (CompareStr(tempstr1,tempstr2) >0)) or((not isarc) and (CompareStr(tempstr1,tempstr2) <0))then begin temp := List.Items[i]; List.Items[i] := list.Items[j]; List.Items[j] := temp; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin Sort(List,false); FillMem(memo2); end; procedure TForm1.FillMem(Memo: Tmemo); var i: integer; peo: pPeople; begin memo.Clear; for i := 0 to List.Count - 1 do begin peo := List.Items[i]; memo.Lines.Add(peo^.Name + ' '+peo^.Sex + ' '+ inttostr(peo^.Age)); end; end; end. |