tarrayprojectdouble.lpr 2.2 KB

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