降序列表框项目Delphi XE8

拱布鲁克斯

我正在审查一些有关如何按降序对列表框项目进行排序的问题。似乎默认且唯一的顺序是递增的。我们确实有字符串集合(TStringList)的可用性。

在我看来,如果我们将排序目标插入到集合列表中,执行排序(以升序排列),但是以降序访问排序后的项,并在键被剥离后将它们添加到未排序的列表框项中,收到所需的下降效果。

procedure TBCSLBDemoC.DescendLZB(var lb: TListBox);
var
  sc: TStringList;
  i: Integer;
  rdt: TDateTime;
  buf : string;
begin
  sc := TStringList.Create;
  i := 0;
  repeat
    rdt := TFile.GetLastAccessTime(lb.Items[i]);
    sc.Add(FormatDateTime('YYYYMMDDHHMMSS', rdt) + ' ' + lb.Items[i]);
    Inc(i);
  until (i > (lb.Count - 1));
  sc.Sort;
  lb.Sorted := false;
  lb.Items.Clear;
  i := sc.Count - 1;
  repeat
    buf := sc[i];
    Delete(buf, 1, 15);
    lb.Items.Add(buf);
    dec(i);
  until (i < 0);
  sc.Free;
end;

这些结果对我来说似乎很好,但是我的问题是我将如何改进这种技术?我相信我已经忽略了一些东西。

大卫·赫弗南(David Heffernan)

您可以采用许多不同的方法来解决此问题。您已经显示了一种方法。您可以切换到虚拟列表框,并将数据存储在保持顺序的数据结构中。您可以就地对列表进行排序。

就我个人而言,查看您的代码以创建一个新列表以执行排序时,我感到有些不安。而且,通过使用时间戳记的文本表示,甚至会更加烦躁。如果列表中有大量项目,则虚拟模式会更有效。

但是,我将演示一种非常灵活的方法来就地对列表进行排序。让我们从我的答案中的代码开始:https : //stackoverflow.com/a/21702570/505088为了自给自足,让我们在这里重现代码,并对其进行稍作修改以使用参考过程:

type
  TCompareIndicesFunction = reference to function(Index1, Index2: Integer): Integer;
  TExchangeIndicesProcedure = reference to procedure(Index1, Index2: Integer);

procedure QuickSort(Count: Integer; Compare: TCompareIndicesFunction; 
  Exchange: TExchangeIndicesProcedure);

  procedure Sort(L, R: Integer);
  var
    I, J, P: Integer;
  begin
    repeat
      I := L;
      J := R;
      P := (L+R) div 2;
      repeat
        while Compare(I, P)<0 do inc(I); 
        while Compare(J, P)>0 do dec(J); 
        if I<=J then 
        begin
          if I<>J then 
          begin
            Exchange(I, J);
            //may have moved the pivot so we must remember which element it is
            if P=I then
              P := J
            else if P=J then
              P := I;
          end;
          inc(I);
          dec(J);
        end;
      until I>J;
      if L<J then 
        Sort(L, J); 
      L := I;
    until I>=R;
  end;

begin
  if Count>0 then
    Sort(0, Count-1);
end;

这里的关键思想是将排序算法与数据存储区分开来。这就是给我们带来灵活性的原因。

接下来,我们需要实现比较和交换功能。像这样:

var
  Compare: TCompareIndicesFunction;
  Exchange: TExchangeIndicesProcedure;

Compare := 
  function(Index1, Index2: Integer): Integer
  var
    dt1, dt2: TDateTime;
  begin
    dt1 := TFile.GetLastAccessTime(lb.Items[Index1]);
    dt2 := TFile.GetLastAccessTime(lb.Items[Index2]);
    if dt1=dt2 then begin
      Result := 0;
    end else if dt2<dt1 then begin
      Result := -1
    end else begin
      Result := 1;
    end;
  end;

Exchange := 
  procedure(Index1, Index2: Integer)
  begin
    lb.Items.Exchange(Index1, Index2);
  end;

请注意,我正在比较时间戳的数字值,感觉更令人愉悦。如果我把命令放到最前面(我总是在使用排序比较功能),那么如何逆转它应该很明显。

最后我们可以像这样排序:

QuickSort(lb.Count, Compare, Exchange);

此代码应放在您的代码中DescendLZB,以便可以捕获列表框。此外,该lb参数不应是var参数,因为您不想修改其值。

所有这些看起来像这样:

procedure TBCSLBDemoC.DescendLZB(lb: TListBox);
var
  Compare: TCompareIndicesFunction;
  Exchange: TExchangeIndicesProcedure;
begin
  Compare := 
    function(Index1, Index2: Integer): Integer
    var
      dt1, dt2: TDateTime;
    begin
      dt1 := TFile.GetLastAccessTime(lb.Items[Index1]);
      dt2 := TFile.GetLastAccessTime(lb.Items[Index2]);
      if dt1=dt2 then begin
        Result := 0;
      end else if dt2<dt1 then begin
        Result := -1
      end else begin
        Result := 1;
      end;
    end;

  Exchange := 
    procedure(Index1, Index2: Integer)
    begin
      lb.Items.Exchange(Index1, Index2);
    end;
  end;

  QuickSort(lb.Count, Compare, Exchange);
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Delphi XE8加载PDF文件

用于delphi XE8的多设备Bcrypt库

使用Delphi XE8进行XSLT转换的替代方法

Delphi XE8 idHttp Erromessage文本编码错误

Delphi Xe8,如何获取android设备令牌?

prestashop中的delphi XE8 REST接口PUT

在显示模态的Delphi XE8上将浮点除以零

Delphi XE8 FMX Android 和 USSD 代码

如何使用delphi XE8 firemonkey项目更新数据库?

如何知道Delphi XE8中位图的比例尺?

如何防止应用程序在Delphi XE8中进入睡眠模式

我该如何配置新的Delphi XE8 Editor起始视觉提示?

Delphi-自XE8起如何正确注册图形类?

Delphi XE8在应用程序启动时优雅地处理ETetheringException

如何在Delphi XE8中添加64位目标平台?

Delphi xe8,无法重命名组件xxx,该组件以祖先形式引入

TList <T>中的Delphi XE8错误,需要解决方法

在Delphi XE8的移动编译器中哪些指针相关的东西不起作用?

Delphi XE8更新1-找不到随机文件

当“ |”时,IDE挂起。在源代码中。这是Delphi XE8中的错误吗?

与其他Delphi版本相比XE8中的System.Generics.Collections差异

Delphi XE8中的数字分区算法生成器

DELPHI XE8:OnCreate事件期间未刷新Android上的TRectangle

Delphi XE8 Firemonkey iOS应用程序仅通过TEdit崩溃

优雅地关闭了Indy TCPServer移动应用程序Delphi XE8

如何使用Delphi XE8使用SHA-3 / 256对字符串进行哈希处理?

将数据从TIdTCPClient发送到FMX中的TServerSocket不适用于Delphi XE8

Delphi XE8:运行外部控制台应用程序,等待其结果并捕获其结果时出现问题

RAD Studio XE8 表现怪异