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.
//测试结果如下图
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;
楼主给的函数未能成功的调用~~!恕我学浅…原因是数据类型的转换:TStringList、array of string、string、strings这四种数据类型之间的转换。比如说,如何通过调用函数function St(SL: TStringList): SortArr;将edit1的文本内容进行排序,然后在memo1中显示出来。
二楼给出函数,在delphi 7.0环境下编译通过。两个showmessage(sl.text)输出的都是源字符串!