1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
// Generic types for FreeSparta.com and FreePascal!
// Original version by keeper89.blogspot.com, 2011
// FPC version by Maciej Izak (hnb), 2014
program TArrayProjectDouble;
{$MODE DELPHI}
{$APPTYPE CONSOLE}
uses
SysUtils, Math, Types, Generics.Collections, Generics.Defaults;
type
TDoubleIntegerArray = array of TIntegerDynArray;
procedure PrintMatrix(A: TDoubleIntegerArray);
var
i, j: Integer;
begin
for i := Low(A) to High(A) do
begin
for j := Low(A[0]) to High(A[0]) do
Write(A[i, j]: 3, ' ');
Writeln;
end;
Writeln; Writeln;
end;
function CustomCompare_1(constref Left, Right: TIntegerDynArray): Integer;
begin
Result := TCompare.Integer(Right[0], Left[0]);
end;
function CustomCompare_2(constref Left, Right: TIntegerDynArray): Integer;
var
i: Integer;
begin
i := 0;
repeat
Result := TCompare.Integer(Right[i], Left[i]);
Inc(i);
until ((Result <> 0) or (i = Length(Left)));
end;
var
A: TDoubleIntegerArray;
FoundIndex: Integer;
i, j: Integer;
begin
WriteLn('Working with TArray - a two-dimensional integer array');
WriteLn;
// Fill integer array with random numbers [1 .. 50]
SetLength(A, 4, 7);
Randomize;
for i := Low(A) to High(A) do
for j := Low(A[0]) to High(A[0]) do
A[i, j] := Math.RandomRange(1, 50);
// Equate some of the elements for further "cascade" sorting
A[1, 0] := A[0, 0];
A[2, 0] := A[0, 0];
A[1, 1] := A[0, 1];
// Print out what happened
Writeln('The original array:');
PrintMatrix(A);
// ! FPC don't support anonymous methods yet
//TArray.Sort<TIntegerDynArray>(A, TComparer<TIntegerDynArray>.Construct(
// function (const Left, Right: TIntegerDynArray): Integer
// begin
// Result := Right[0] - Left[0];
// end));
// Sort descending 1st column, with cutom comparer_1
TArrayHelper<TIntegerDynArray>.Sort(A, TComparer<TIntegerDynArray>.Construct(
CustomCompare_1));
Writeln('Descending in column 1:');
PrintMatrix(A);
// Sort descending 1st column "cascade" -
// If the line items are equal, compare neighboring
TArrayHelper<TIntegerDynArray>.Sort(A, TComparer<TIntegerDynArray>.Construct(
CustomCompare_2));
Writeln('Cascade sorting, starting from the 1st column:');
PrintMatrix(A);
Readln;
end.
|