Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ranking von Weitenangaben ermitteln (https://www.delphipraxis.net/193558-ranking-von-weitenangaben-ermitteln.html)

torud 15. Aug 2017 09:29

Ranking von Weitenangaben ermitteln
 
Hallo Wissende,

wir ermitteln diverse Weiten beim Sport und geben die Daten in ein AdvStringgrid ein. Dort kann man die Spalten schon nach Wertigkeiten absteigend Sortieren lassen. Nun müssen wir aber noch den Rang ermitteln. Ich glaube, dass hier wahrscheinlich Rekursion zum Einsatz kommt - richtig?

Hätten alle einen anderen Wert, wäre es wohl einfach, aber es könnte auch folgende Datenlage zugrunde liegen:

320m
315m
315m
305m
299m
299m

Dann hätten wir eine Platzierung von 1, 2, 2, 4, 5, 5.

Könnt ihr mir verraten, wie ich die Schleife programmieren muss?

himitsu 15. Aug 2017 10:27

AW: Ranking von Weitenangaben ermitteln
 
So schwer ist das doch nicht?
Absteigend sortierte Liste, fängst bei 1 an, weißt das nacheinander deinen Zeilen zu
und dann immer um 1 hochzählen, wenn der vorherrige Wert nicht dem aktuellen Wert entspricht.


SQL-Code:
rank() OVER (ORDER BY wert) as ranking
-- oder
row_number() OVER (ORDER BY wert) as ranking
Ins OVER noch ein GROUP BY wert oder DISTINCT rein.
https://support.microsoft.com/de-de/...-sql-statement
Guck in die Doku deines DBMS ... sowas gibt es fast überall.

Im Prinzip die bestehenden Werte sortieren, gruppieren (gleiche zusammenfassen) und dann den Index aus dieser Liste als Ranking verwenden.

torud 15. Aug 2017 12:20

AW: Ranking von Weitenangaben ermitteln
 
Jo vielen Dank erstmal.
Ich schau´s mir nochmal an.

Mit SQL und DB hat das Ganze aber nichts zu tun. Wir geben die Daten direkt in ein Stringgrid ein.

Sherlock 15. Aug 2017 12:30

AW: Ranking von Weitenangaben ermitteln
 
Zitat:

Zitat von torud (Beitrag 1378782)
Mit SQL und DB hat das Ganze aber nichts zu tun. Wir geben die Daten direkt in ein Stringgrid ein.

Dadurch, daß Daten und Darstellung ja getrennt zu halten sind, mußt Du Dir aber Gedanken über ein Datenmodell machen, egal wie simpel es ist. Denn in dem Grid speichert man nichts, man zeigt nur an.

Sherlock

himitsu 15. Aug 2017 12:42

AW: Ranking von Weitenangaben ermitteln
 
Zitat:

Zitat von torud (Beitrag 1378782)
Mit SQL und DB hat das Ganze aber nichts zu tun. Wir geben die Daten direkt in ein Stringgrid ein.

Zitat:

Zitat von himitsu (Beitrag 1378760)
So schwer ist das doch nicht?
Absteigend sortierte Liste, fängst bei 1 an, weißt das nacheinander deinen Zeilen zu
und dann immer um 1 hochzählen, wenn der vorherrige Wert nicht dem aktuellen Wert entspricht.

Alternativ eine zweite sortierte Liste mit den Werten (ohne Doppelung) und dann bekommt man drüben via IndexOf+1 das Ranking raus.

torud 15. Aug 2017 12:43

AW: Ranking von Weitenangaben ermitteln
 
Ok, ich widerspreche Dir auf keinen Fall, aber es ist so, dass wir die Daten in das Stringgrid eingeben, weil es einfach nicht anders geht, schnell und einfach ist.
OOP war noch nie meine Stärke und ich tu mich gerade echt schwer extra eine Klasse aufzusetzen, nur um die Daten aus dem Stringgrid darin zu überführen...
Ich werds schon irgendwie hinbekommen. Einen Rang zu ermitteln, wenn es keine Dopplung gibt ist einfach. Ich muss nur noch für den Spezialfall vorsorgen.

torud 15. Aug 2017 12:44

AW: Ranking von Weitenangaben ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1378760)
So schwer ist das doch nicht?
Absteigend sortierte Liste, fängst bei 1 an, weißt das nacheinander deinen Zeilen zu
und dann immer um 1 hochzählen, wenn der vorherrige Wert nicht dem aktuellen Wert entspricht.

Alternativ eine zweite sortierte Liste mit den Werten (ohne Doppelung) und dann bekommt man drüben via IndexOf+1 das Ranking raus.[/QUOTE]

Ich schau mal, bin gerade dran...

torud 15. Aug 2017 12:49

AW: Ranking von Weitenangaben ermitteln
 
Nicht schön, aber damit gehts schon mal. Die doppelt vorhandenen Ränge werden nicht angezeigt. Von daher stimmt die Zählweise schon.
Danke für den Denkanstoß...

Delphi-Quellcode:
  //Rang bestimmen
  iRang := 0;
  iWidth := 0;
  iLastWidth := 0;
  for i := 1 to FrameVorrundeOutput1.grdPlayers.RowCount -1 do
    begin
      iWidth := StrToIntDef(FrameVorrundeOutput1.grdPlayers.Cells[2,i],0);
      if iWidth > 0 then
        begin
          if iWidth = iLastWidth then
            begin
              inc(iRang);
            end
          else
            begin
              inc(iRang);
              FrameVorrundeOutput1.grdPlayers.Cells[0,i] := IntToStr(iRang);
            end;
          iLastWidth := iWidth;
        end;
    end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz