Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Сортировка двумерного массива структур TNode по полю HCost в Delphi: решение проблемы несовместимости типов с TArray.Sort"

Delphi , Базы данных , Сортировка и Фильтр

Заголовок: "Сортировка двумерного массива структур TNode по полю HCost в Delphi: решение проблемы несовместимости типов с TArray.Sort"

Вопрос: Как отсортировать двумерный массив структур TNode по полю HCost в Delphi с использованием TArray.Sort, не получая ошибку несовместимости типов?

Контекст: У нас есть двумерный массив структур TNode, которые представляют собой узлы в каком-либо графе. Каждая структура TNode содержит информацию о посещении узла, стоимости пути от начальной точки до текущего узла (GCost) и стоимости пути от текущего узла до целевого узла (HCost). Нам нужно отсортировать этот массив по полю HCost, чтобы потом можно было легко находить узлы с наименьшей стоимостью пути до целевого узла.

Решение: Чтобы отсортировать массив TNode по полю HCost с помощью TArray.Sort, нам нужно определить функцию сравнения, которая будет возвращать Integer, а не Double. В противном случае мы получим ошибку несовместимости типов. Мы можем определить такую функцию сравнения самостоятельно или использовать встроенный comparer для Double.

Пример кода на Object Pascal (Delphi):

type
  PNode = ^TNode;
  TNode = record
    Obstacle: boolean;
    Visited: boolean;
    GCost: Double; // Distance from Starting Node
    HCost: Double; // Distance from Target Node
    x, y: Integer;
    vecNeighBour: array of PNode;
    Parent: PNode;
  end;

var
  Node: array of array of TNode;

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

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

procedure TForm.FormShow(Sender: TObject);
begin
  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;

  SortNodeArrayByHCost(Node);
end;

В данном примере мы определили функцию CompareDoubleInc, которая сравнивает два числа с плавающей точкой и возвращает Integer в зависимости от того, равны ли они, первое меньше второго или второе меньше первого. Затем мы используем эту функцию в качестве comparer для TArray.Sort, чтобы отсортировать массив Node по полю HCost.

Альтернативный ответ: Мы также можем использовать встроенный comparer для Double, определенный в TComparer

Создано по материалам из источника по ссылке.

Контекст: У нас есть двумерный массив структур TNode, которые представляют собой узлы в каком-либо графе. Каждая структура TNode содержит информацию о посещении узла, стоимости пути от начальной точки до текущего узла (GCost) и стоимости пути от текущего


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:32:34/0.014157056808472/1