Если вы хотите отсортировать элементы по дополнительному ключу, это будет важно только в случае, когда основные ключи равны. В вашем примере это случай, когда result := 0;.
Итак, вы можете что-то подобное:
function SortCoords(Item1, Item2: Pointer): Integer;
var
line1, line2: Coords;
begin
line1 := Coords(Item1);
line2 := Coords(Item2);
if (line1.X < line2.X) then
result := -1
else if (line1.X > line2.X) then
result := 1
else
begin
if (line1.Y < line2.Y) then
result := -1
else if (line1.Y > line2.Y) then
result := 1
else
result := 0;
end;
end;
В этом примере, если x-координаты равны, мы сравниваем y-координаты для дальнейшей сортировки.
Если вы предпочитаете использовать классы, вот альтернативный вариант:
type
TCoord = record
X, Y: Integer;
constructor Create(AX, AY: Integer);
end;
function SortCoords(Item1, Item2: Pointer): Integer;
var
line1, line2: TCoord;
begin
line1 := TCoord(Item1);
line2 := TCoord(Item2);
if (line1.X < line2.X) then
result := -1
else if (line1.X > line2.X) then
result := 1
else
begin
if (line1.Y < line2.Y) then
result := -1
else if (line1.Y > line2.Y) then
result := 1
else
result := 0;
end;
end;
constructor TCoord.Create(AX, AY: Integer);
begin
X := AX;
Y := AY;
end;
Но для таких простых данных, как координаты, возможно, было бы лучше использовать запись (record).
Альтернативный ответ
Вы также можете использовать встроенный метод Sort без написания собственной функции сравнения:
type
TCoord = record
X, Y: Integer;
end;
var
Coords: TArray<TCoord>;
begin
Coords := [(7,8), (10,22), (7,3), (5,10), (20,14), (7,10), (7,3)];
TArray<TCoord>.Sort(Coords, TComparer<TCoord>.Construct(
function(const Left, Right: TCoord): Integer
begin
if Left.X < Right.X then
-1
else if Left.X > Right.X then
1
else
begin
if Left.Y < Right.Y then
-1
else if Left.Y > Right.Y then
1
else
0;
end;
end));
end;
В этом примере мы создаем собственный компаратор для сортировки по x и y координатам.
Данный контекст описывает задачу расширения существующей функции сортировки по x-координатам в Delphi для добавления дополнительной сортировки по y-координатам.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS