You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi泛型TArray.Sort技术咨询:新手节点数组实现相关问题

嗨,从你定义的TNode结构来看,应该是在做路径搜索相关的开发(很像A*算法的节点设计),关于Delphi里TArray.Sort的使用,我来给你详细拆解适配你场景的方案:

一、TArray.Sort的核心基础

首先要明确,TArray.Sort是Delphi泛型框架下的数组排序工具,需要引用System.Generics.Collections和System.Generics.Defaults两个单元才能使用。它支持两种核心排序模式:

  • 对简单类型数组(如TArray<Integer>)直接使用默认规则排序
  • 对自定义类型(比如你的TNode/PNode)通过匿名方法或自定义比较器接口实现自定义排序逻辑
二、适配你的节点结构的排序实现

结合你的TNode包含GCost和HCost的特点,最常见的排序需求是按FCost(GCost + HCost)升序排列(A*算法中开放列表的排序逻辑),下面给你两种实现方式:

方式1:匿名方法快速实现(适合临时场景)

如果只是在某一处需要排序,匿名方法是最快捷的方式,无需额外定义类:

uses System.Generics.Collections, System.Generics.Defaults;

var
  OpenList: TArray<PNode>; // 假设这是你需要排序的节点指针数组
begin
  // 调用TArray.Sort,传入自定义比较逻辑
  TArray.Sort<PNode>(OpenList, 
    function(const A, B: PNode): Integer
    var
      FCostA, FCostB: Double;
    begin
      FCostA := A^.GCost + A^.HCost;
      FCostB := B^.GCost + B^.HCost;
      
      // 按FCost升序排序,值越小优先级越高
      if FCostA < FCostB then
        Result := -1
      else if FCostA > FCostB then
        Result := 1
      else
      begin
        // 如果FCost相同,可按HCost升序(或GCost,根据你的算法需求调整)
        if A^.HCost < B^.HCost then
          Result := -1
        else if A^.HCost > B^.HCost then
          Result := 1
        else
          Result := 0;
      end;
    end);
end;

方式2:实现IComparer<T>接口(适合复用场景)

如果需要在多个地方复用相同的排序逻辑,建议定义一个实现IComparer<PNode>的比较器类:

uses System.Generics.Collections, System.Generics.Defaults;

type
  TNodeFCostComparer = class(TInterfacedObject, IComparer<PNode>)
  public
    function Compare(const A, B: PNode): Integer;
  end;

function TNodeFCostComparer.Compare(const A, B: PNode): Integer;
var
  FCostA, FCostB: Double;
begin
  FCostA := A^.GCost + A^.HCost;
  FCostB := B^.GCost + B^.HCost;
  
  if FCostA < FCostB then
    Result := -1
  else if FCostA > FCostB then
    Result := 1
  else
  begin
    // 自定义次级排序规则,这里以HCost为例
    if A^.HCost < B^.HCost then
      Result := -1
    else if A^.HCost > B^.HCost then
      Result := 1
    else
      Result := 0;
  end;
end;

// 使用示例
var
  OpenList: TArray<PNode>;
  Comparer: IComparer<PNode>;
begin
  Comparer := TNodeFCostComparer.Create;
  TArray.Sort<PNode>(OpenList, Comparer);
end;
三、关键注意事项
  • 因为你使用的是PNode指针类型,排序时要确保所有指针都指向有效的TNode实例,避免空指针访问报错
  • 如果需要排序你的二维数组Node: array of array of TNode,需要先把目标节点提取到一维动态数组(如TArray<TNode>或TArray<PNode>)中,再调用TArray.Sort——因为它仅支持一维泛型数组的排序
  • 务必确认已经引用了System.Generics.Collections和System.Generics.Defaults单元,否则会出现编译错误

内容的提问来源于stack exchange,提问作者user1937012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:23