delphi字符排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi字符排序相关的知识,希望对你有一定的参考价值。

写一个字符串列表(字符串数组)的排序函数,排序时只考虑每个字符串的奇数位。
函数定义如下:
delphi: procedure Sort(StringList:TStringList);
例如:“ABCD”则只当作“AC”来排序,“1975ac8b”则只当作“17a8”来排序,“windows”则只当作“wnos”来排序……
如果同时录入如下三个字符串“ABCD”和“1975ac8b”、“windows”,则排序结果是
17a8
AC
wnos
注意:假设有上百万个字符串,必须尽可能考虑用“最快”的运算速度。

我的邮箱地址是:qinjian-86@163.com
测试通过才能绘分。

//建义用涵数。。

type

  SortArr=array of string;

function St(SL: TStringList): SortArr;

var

  i: Integer;

  tep: string;

  function S(str: string): string;

  var

    k: Integer;

    j:string;

  begin

    for k := 1 to Length(str) do

    begin

      if k mod 2 = 1 then

      begin

        j:= j+ copy(str, k, 1);

      end;

      Result:=j;

      //ShowMessage(Result);

    end;

  end;

begin

  SetLength(result, SL.Count);

  for i := 0 to SL.Count - 1 do

  begin

    tep := SL.Strings[i];

    Result[i]:=s(tep);

  end;

end;

//花了一个下午的时间才想出。。希望对你有帮助。。 如果不会调用的话在HI百度留言,我发Q号给你跟你讲解如何调用 

代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    Memo2: TMemo;

    Label1: TLabel;

    procedure Button1Click(Sender: TObject);

  private

     Private declarations 

  public

     Public declarations 

  end;

var

  Form1: TForm1;

type

  SortArr=array of string;

implementation

$R *.dfm

function St(SL: TStringList): SortArr;

var

  i: Integer;

  tep: string;

  function S(str: string): string;

  var

    k: Integer;

    j:string;

  begin

    for k := 1 to Length(str) do

    begin

      if k mod 2 = 1 then

      begin

        j:= j+ copy(str, k, 1);

      end;

      Result:=j;

      //ShowMessage(Result);

    end;

  end;

begin

  SetLength(result, SL.Count);

  for i := 0 to SL.Count - 1 do

  begin

    tep := SL.Strings[i];

    Result[i]:=s(tep);

  end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

  List:TStringList;

  i:integer;

begin

  Memo2.Lines.Clear;

  list:=TStringList.Create;

    List.AddStrings(Memo1.Lines);

    //St(List);

    for i:=Low(St(List)) to High(St(List)) do

    begin

     Memo2.Lines.Add(St(List)[i]);

    end;

end;

end.

//测试结果如下图

参考技术A function CustomSortProc(List: TStringList; Index1, Index2: Integer): Integer;
var
i :integer;
txt1,txt2,tmp :widestring;
begin
tmp := List.Strings[Index1];
txt1 := '';
i := 1;
repeat
txt1 := txt1 + tmp[i];
Inc(i,2);
until i >= Length(tmp);
tmp := List.Strings[Index2];
txt2 := '';
i := 1;
repeat
txt2 := txt2 + tmp[i];
Inc(i,2);
until i >= Length(tmp);
Result := CompareText(txt1,txt2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sl :TStringList;
begin
sl := TStringList.Create;
try
sl.Add('ABCD');
sl.Add('1975ac8b');
sl.Add('1a6782');
sl.Add('windows');
sl.Add('aw4u3f');
sl.Sort;
showmessage(sl.Text); //显示默认排序
sl.CustomSort(CustomSortProc);
showmessage(sl.Text) //显示只选字符的奇数位排序
finally
FreeAndNil(sl);
end;
end;
参考技术B 测试如下:
楼主给的函数未能成功的调用~~!恕我学浅…原因是数据类型的转换:TStringList、array of string、string、strings这四种数据类型之间的转换。比如说,如何通过调用函数function St(SL: TStringList): SortArr;将edit1的文本内容进行排序,然后在memo1中显示出来。
二楼给出函数,在delphi 7.0环境下编译通过。两个showmessage(sl.text)输出的都是源字符串!

Delphi中Stringlist的自定义排序(将函数地址做为参数)

近日,在编制一个程序过程,因为数据量较小,就使用了stringlist来暂存数据。在使用过程中,遇到了一个问题。Stringlist字符串列表的默认排序方法是按ASCII码的方式进行排序,如3,10,9排序时,结果为10,3,9.不符合程序的要求,于是尝试着使用字符串列表的自主义排序方法,这时需要传入一个function类的参数,因为习惯于使用PYTHON语言,所以直接编写民了一个按数值降序排列的排序函数,并将函数名传给了stringlistrr的CustomSort方法,结果提示:Incompatible types: ‘regular procedure and method pointer‘。大致意思是:不匹配的类型:需要一个方法、过程的指针类型。

为了解决这个问题,到网上查找资料,发现这个问题经常会遇到,但是各个解答要不就是看不懂,要不就是运行不成功,经过多次尝试,最终解决了这个问题。

通过分析源代码,结合网上程序,理清了网上的解决思路:1、在type处,定义一个function类型,.如:Tfunc=function(list: TStringList; index1,index2: Integer): Integer;  2、定义一个全局变量:如:myfunc:Tfunc;

3、编写一个自定义的排序程序:如以下程序

function curmsort(list: TStringList; index1,
  index2: Integer): Integer;
var
  value1, value2: Integer;
begin
  value1 := StrToInt(list.Strings[index1]);
  value2 := StrToInt(list.Strings[index2]);
  if value1> value2 then
    Result :=  -1
  else if value1< value2 then
    Result := 1
  else
    Result := 0;
end;

4、在排序时,首先执行myfunc:=curmsort;(将自定义的函数名赋值给myfunc变量。)list.sorted:=False;,关闭排序,然后执行list.CustomSort(myfunc);

按照这个思路,最终也完成了自定义排序(将函数地址传参)的功能。

完成后,回顾整个程序,通过对比、思考、实验,发现第一、二步和最后一步的将函数名赋值给函数类型的变量都是可以省略的,关键的是自己定义的排序函数curmsort不能进行声明,只要声明了就不好使,个人感觉应该是因为在不声明的情况下,函数名仅代表的是函数的内存地址,而不是执行函数的返回值。前边的失败是因为将函数进行了声明,这时函数名代表了函数执行后的返回值,所以才导致类型不匹配。

例程如下:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  
  TForm1 = class(TForm)
    lst1: TListBox;
    lst2: TListBox;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
//注意,自定义的函数curmsort不能进行声明。
    { Private declarations }
  public
    { Public declarations }
  end;

var
  
  Form1: TForm1;

implementation

{$R *.dfm}
function curmsort(list: TStringList; index1,   
  index2: Integer): Integer;   //写函数时,函数名前不能加Tform1等限制。
var
  value1, value2: Integer;
begin
  value1 := StrToInt(list.Strings[index1]);
  value2 := StrToInt(list.Strings[index2]);
  if value1> value2 then
    Result :=  -1
  else if value1< value2 then
    Result := 1
  else
    Result := 0;
end;

procedure TForm1.btn1Click(Sender: TObject);
var list:TStringList;i:Integer;
begin
  list:=TStringList.Create;
  for i:=0 to 30 do
    begin
      list.Add(IntToStr(Random(3000)));
    end;
  lst1.Items.Assign(list);
  
  list.Sorted:=False;
  list.CustomSort(curmsort);
  lst2.Items.Assign(list);
end;

end.

 

以上是关于delphi字符排序的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中Stringlist的自定义排序(将函数地址做为参数)

Delphi 中,有没有对数组进行排序的函数?

Delphi字符串排列顺序

delphi编程 文本数字排序

对 Delphi 数据集进行排序

delphi listbox 排序