加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

排序 – Delphi Generics:TArray.Sort

发布时间:2020-12-15 09:26:27 所属栏目:大数据 来源:网络整理
导读:我刚刚开始对此感到困惑. PNode = ^TNode;TNode = record Obstacle : boolean; Visited : boolean; GCost : double; // Distance from Starting Node HCost : double; // Distance from Target Node x : integer; y : integer; vecNeighBour : array of PNod
我刚刚开始对此感到困惑.

PNode = ^TNode;

TNode = record
  Obstacle : boolean;
  Visited : boolean;
  GCost : double; // Distance from Starting Node
  HCost : double; // Distance from Target Node
  x : integer;
  y : integer;
  vecNeighBour : array of PNode;
  Parent : PNode;
end;

OnFormShow我填充数组:

SetLength(Node,4,4);

 Image1.Height:=Length(Node)*50;
 Image1.Width:=Length(Node)*50;

 for x := Low(Node) to High(Node) do
   for y := Low(Node) to High(Node) do
      begin
        Node[x,y].Obstacle:=false;
        Node[x,y].Visited:=false;
        Node[x,y].GCost:=infinity;
        Node[x,y].HCost:=infinity;
        Node[x,y].x:=x;
        Node[x,y].y:=y;
      end;

现在我想用HCost对这个数组进行排序,所以我尝试了这个.

TArray.Sort<TNode>(Node,TComparer<TNode>.Construct(
  function(const Left,Right: TNode): double
  begin
    if Left.HCost > Right.HCost then
      Result:=Left.HCost
    else
      Result:=Right.HCost;
  end));

我的知识严重缺乏这方面的东西.我从Delphi收到错误

“Incompatible types:
‘System.Gerenics.Defaults.TComparison and ‘Procedure’

我在这做错了什么?

解决方法

比较函数必须返回Integer值.它定义如下:

type
  TComparison<T> = reference to function(const Left,Right: T): Integer;

您的函数返回错误的类型.

function CompareDoubleInc(Item1,Item2: Double): Integer;
begin
  if Item1=Item2 then begin
    Result := 0;
  end else if Item1<Item2 then begin
    Result := -1
  end else begin
    Result := 1;
  end;
end;

....

TArray.Sort<TNode>(
  Node,TComparer<TNode>.Construct(
    function(const Left,Right: TNode): Integer
    begin
      Result := CompareDoubleInc(Left.HCost,Right.HCost);
    end
  )
);

或者如果你想让它更简单,你可以委托默认的双倍比较器:

TArray.Sort<TNode>(
  Node,Right: TNode): Integer
    begin
      Result := TComparer<Double>.Default.Compare(Left.HCost,Right.HCost);
    end
  )
);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读