我用以下代码生成了一个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版我刚来,不知道对所发帖子的分数上限有什么规定。总之分不是问题。

解决方案 »

  1.   

    AddObject 可以添加任何类型的数据,因为它是个指针,具体的类型需要你自己自定。不需要重新写一个类,我记得delphi的help里面有一段AddObject的代码。
      

  2.   

    unit Unit2;interfaceuses
      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;
      

  3.   

    补充:在使用赋值或者对象Assign时对象好像不能一起被赋值。
      

  4.   

    to hawksoft(明月清风)
    你给的代码只是演示了如何使FStrings.AddObject()方法的第二个参数为整数,但是并没有利用第二个参数值来排序。我主要是想知道怎样利用数组d的值来为FStrings排序,或者TStringList有没有现成的利用第二个参数值来排序方法。
      

  5.   

    看来只有自己写一个排序的函数了。
    我把Delphi带的线程例子里的快速排序函数改了一下,速度还可以接受。
    先不给分,再等一两天,希望高手们提出更好的方法。
      

  6.   

    定义一个两维组,如c[2,n]
    第一列填为顺序号,第二列为d内容。按第二列排好序后,把第一列作为itemindex把数据复制到一个新的stringlist,free掉原stringlist.