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
相关产品推荐
相关产品推荐

