AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Doppel schnell aus Liste löschen.

Ein Thema von Bjoerk · begonnen am 7. Dez 2014 · letzter Beitrag vom 14. Dez 2014
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 08:18
OK. Vielen Dank für die Beiträge. Ich werde mal testen. Bei der Sort Variante bin ich mir im Moment gar nicht sicher, ob eine so sortierte Liste garantiert, daß identische Punkte auch hintereinander in der Liste liegen.
Delphi-Quellcode:
procedure TFloatPoints.QuickSort(L, R: integer);
var
  I, J, K: integer;
  Pivot: TFloatPoint;
begin
  repeat
    I := L;
    J := R;
    K := (L + R) shr 1;
    Pivot := FItems[K];
    repeat
      while (FItems[I].X < Pivot.X) and (FItems[I].Y < Pivot.Y) do
        Inc(I);
      while (FItems[J].X > Pivot.X) and (FItems[J].Y > Pivot.Y) do
        Dec(J);
      if I <= J then
      begin
        Exchange(I, J);
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(L, J);
    L := I;
  until I >= R;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#2

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 08:45
Bei der Sort Variante bin ich mir im Moment gar nicht sicher, ob eine so sortierte Liste garantiert, daß identische Punkte auch hintereinander in der Liste liegen.
Wenn nicht, dann stimmt was mit der Sortierung nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 10:11
Aha.
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#4

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 10:49
Hallo,

Du sortierst doch zweidimensional.
Da musst Du doch zuerst x und nur bei gleichem x auf y testen

Statt
Delphi-Quellcode:
while (FItems[I].X <= Pivot.X) and (FItems[I].Y < Pivot.Y) do
        Inc(I);
Nun
Delphi-Quellcode:
while true do
  begin
  IF FItems[I].X < Pivot.X then
    inc(i)
  else
    IF (FItems[I].X = Pivot.X) AND (FItems[I].Y < Pivot.Y) then
      inc(i)
    else
      Break;
  end;
Gruß Horst
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 11:37
Hallo,
Du sortierst doch zweidimensional. Da musst Du doch zuerst x und nur bei gleichem x auf y testen []..
Thanx. Das war das wo ich auf dem Schlauch stand.
Delphi-Quellcode:
function TFloatPoints.SortCompare(const I, J: integer): integer;
const
  Eps = 1E-4;
var
  A, B: TFloatPoint;
begin
  A := FItems[I];
  B := FItems[J];
  if CompareValue(A.X, B.X, Eps) > 0 then
    Result := 1
  else
    if CompareValue(A.X, B.X, Eps) < 0 then
      Result := -1
    else
      if CompareValue(A.Y, B.Y, Eps) > 0 then
        Result := 1
      else
        if CompareValue(A.Y, B.Y, Eps) < 0 then
          Result := -1
        else
          Result := 0;
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 11:46
Machs doch so ('Sign' müsste in der Unit Math sein'). 'Sign' ist eigentlich gar nicht notwendig.
Delphi-Quellcode:
function TFloatPoints.SortCompare(const I, J: integer): integer;
const
   Eps = 1E-4;
var
   A, B: TFloatPoint;
begin
   A := FItems[I];
   B := FItems[J];
   Result := Sign(CompareValue(A.X, B.X, Eps));
   If Result = 0 then
     Result := Sign(CompareValue(A.Y, B.Y, Eps));
End;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#7

AW: Doppel schnell aus Lise löschen.

  Alt 8. Dez 2014, 12:02
CompareValue gibt auch nur -1, 0 oder +1 raus, also genau das, was SortCompare als Result benötigt, womit man sich das Sign sparen kann.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz