对tlist中的结构进行多项排序

  本文章来源于一个网友的提问如下:
    我有一些数据,保存在tlist中,每项是个结构,如何在对一项排序的基础上,继续排序
    
排序前
张三   男     25
王婆   女     24
李四   男     32
王婆2   女   27
王二   男     28

排序以后
张三   男     25
王二   男     28
李四   男     32
王婆   女     24
王婆2   女   27

 现在整理一下,从新提出来,希望给初学者一点帮助,通过分析
既然是要排序,那么要排的东西应该可以转换为字符串,既然可以转换为字符串,那么我们就可以通过将所有要排的字段全部转换为字符串之后合并为一个字符串,然后比较这个合并后的字符串进行排序则可 ,所以我们可以定义一个函数如下:

DelphiCode:
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; 

整体程序测试代码如下:
正个程序的测试代码如下:

DelphiCode:
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.
 

你可能感兴趣的:(String,list,function,Integer,button,Forms)