tstring 排序问题,急 急

video999 2016-09-24 07:26:04
比如 t.add('abc1')
t.add('abc2')
t.add('abc4')
.....
t.add('abc10')
t.add('abc11')
....

也就是 字符串排序 前面的相同都是abc 后面是数字, 如果默认排序是 abc1 abc10 abc 11 ... abc2 ... 这样了, 但是我要求的是abc1 abc2 .... abc10..... 另外abc这个是变量 不能固定 但是一组中都相同 (其实也就是检索目录中的序列文件进行排序, 而这个序列文件 数字不会补0)

求解决
...全文
2319 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
video999 2016-09-26
  • 打赏
  • 举报
回复
解决了 结帖
video999 2016-09-25
  • 打赏
  • 举报
回复
pathletboy 的方法我试下 , 我查到了 类似的函数,没搞太明白,原来那个 字符串不能有非数字字符, 谢谢, 现在手头没win系统,
video999 2016-09-25
  • 打赏
  • 举报
回复
其实具体要求是这样的,我检索一个目录, 对目录中的文件进行排序, 排序结果要求是 图片1.jpg 图片2.jpg....图片10.jpg .... 图1a1.jpg,图1a2.jpg........图1a10.jpg 如果直接排序会成 图片1.jpg 图片10.jpg 造成混乱(而win系统的按照文件名排序好像可以 正确排序)
pathletboy 2016-09-25
  • 打赏
  • 举报
回复
自定义排序
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes;

function custom_sort(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if Length(List[index1]) < Length(List[index2]) then
  begin
    Result := -1;
    Exit;
  end
  else if Length(List[index1]) > Length(List[index2]) then
  begin
    Result := 1;
    Exit;
  end;
  Result := AnsiCompareStr(List[index1], List[index2]);
end;

var
  t: TStringList;
  i: Integer;

begin
  t := TStringList.Create;
  try
    t.add('abc1');
    t.add('abc2');
    t.add('abc30');
    t.add('abc4');
    t.add('abc10');
    t.add('abc11');
    t.CustomSort(custom_sort);
    for i := 0 to t.Count - 1 do
    begin
      Writeln(t[i]);
    end;
  finally
    t.Free;
  end;
  Readln;

end.

video999 2016-09-25
  • 打赏
  • 举报
回复
这不行 因为前缀的字符串是变量, 无法确定长度,不好截取, 目前暂时解决的办法是 用穷举,先根据前缀的相似程度分组, 然后在组排序, 然后何必组, 好麻烦的说, 好像还有不稳定的因数
lyhoo163 2016-09-25
  • 打赏
  • 举报
回复
Int类型排序,才能按数据值排序。 String类型排序,按从首个字符开始比较,第二个字符比较,。。。,字符之间的比较按ACCII码的次序排序。 这样,你的问题,有二个办法: 1、将排序的字符分成二段:字符(String)+数字(int),进行排序才可以。 这就需要定一个函数,字符分成二段:字符(String)+数字(int)。 2、生成字符时,自动补“0”。 可以写一个函数,自动补充“0”字符。

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧