Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Objekte sortieren mit TArray<T>.BinarySearch

  Alt 13. Mär 2018, 20: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]
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (13. Mär 2018 um 21:09 Uhr)
  Mit Zitat antworten Zitat