Registriert seit: 3. Sep 2004
4.629 Beiträge
Delphi 10.2 Tokyo Starter
|
AW: Objekte sortieren mit TArray<T>.BinarySearch
13. Mär 2018, 21:10
Ist meine Vorgehensweise - also über die Multiplikation eine Wertung herzustellen - so überhaupt korrekt?
Vermutlich nicht.
[...]
Der Comparer hält also die beiden Flag-Arrays für gleich.
Macht Sinn. Bloß wie könnte ich es korrekt machen?
Edit: Alle CompareTo
Implementierungen, die ich gefunden habe, geben lediglich Werte im Bereich [-1, 0, 1] zurück. Habe mir nun einen Testcode gebastelt, der auch wunderbar funktioniert.
Delphi-Quellcode:
type
TTest = record
A, B, C: Integer;
end;
const
A: array[0..4] of TTest = (
(A:0; B:4; C:5),
(A:3; B:4; C:5),
(A:1; B:4; C:5),
(A:0; B:1; C:5),
(A:0; B:5; C:5)
);
var
B: TArray<TTest>;
I, J, C, K: Integer;
begin
SetLength(B, Length(A));
FillChar(B[0], SizeOf(B), #0);
C := 0;
for I := Low(A) to High(A) do
begin
if not TArray.BinarySearch<TTest>(B, A[I], J, TComparer<TTest>.Construct(
function(const Left, Right: TTest): Integer
begin
if (Left.A < Right.A) then Exit(-1) else if (Left.A > Right.A) then Exit(1);
if (Left.B < Right.B) then Exit(-1) else if (Left.B > Right.B) then Exit(1);
if (Left.C < Right.C) then Exit(-1) else if (Left.C > Right.C) then Exit(1);
end), 0, C) then
begin
for K := C downto J + 1 do
begin
B[K] := B[K - 1];
end;
B[J] := A[I];
Inc(C);
end;
end;
end;
Wenn ich das aber im Grunde 1 zu 1 auf mein richtiges Problem übertrage, kommt wieder nur Murks raus
Delphi-Quellcode:
function TMyClass.CompareTo(Other: TMyClass): Integer;
var
I: Integer;
begin
Result := 0;
if (Ord(FAccess) < Ord(Other.FAccess)) then Exit(-1) else
if (Ord(FAccess) > Ord(Other.FAccess)) then Exit(1);
for I := Low(FFlags) to High(FFlags) do
begin
if (Ord(FFlags[I]) < Ord(Other.FFlags[I])) then Exit(-1) else
if (Ord(FFlags[I]) > Ord(Other.FFlags[I])) then Exit(1);
end;
end;
Ich erhalte z.b.:
Code:
[3, 7, 3, 3, 1]
[3, 7, 2, 3, 1]
[3, 7, 3, 3, 5]
gewüscht wäre aber:
Code:
[3, 7, 2, 3, 1]
[3, 7, 3, 3, 1]
[3, 7, 3, 3, 5]
Geändert von Zacherl (13. Mär 2018 um 22:09 Uhr)
|