ASort() auf mehrere Spalten [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

ASort() auf mehrere Spalten [Erledigt]

Beitrag von Jan »

Ich habe ein mehrdimensionales Array, das ich gerne sortieren möchte. Problem: Nicht einfach nach einer Spalte, sondern nach 3. Alle drei Spalten haben numerische Inhalte. Irgendwie will der bei mir aber nicht.

Sinn der Sache ist:
  • Ich sortiere nach Spalte 1.
  • Bei gleichen Werten in Spalte 1 wird zusätzlich nach Spalte 2 sortiert.
  • Bei gleichen Werten in Spalte 1 und 2 wird zusätzlich nach Spalte 3 sortiert.
Aussehen soll das im Prinzip hinterher so:
1
1.1
1.1.1
1.1.2
1.1.3
1.2
1.2.1
1.2.2
usw.

Wie bekomme ich das hin?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten

Beitrag von Martin Altmann »

Moin,
ist doch einfach nur eine Folge verschachtelter iif()s:

Code: Alles auswählen

asort( aJuniorneu,,, {|aX,aY| iif( aX[ 1 ] <> aY[ 1 ], aX[1] < aY[1], iif( aX[ 2 ] <> aY[ 2 ], aX[2] < aY[2], iif( aX[ 3 ] <> aY[ 3 ], aX[ 3 ] < aY[ 3 ], aX[ 4 ] < aY[ 4 ] ) ) ) } )   // Array sortieren nach Tag, Altersklass, Name
Nur um den elseteil (allerletzter Vergleich) müsstest Du Dich dann noch kümmern - in dem Beispiel wird dann nach Spalte 4 sortiert, wenn die ersten drei Spalten jeweils identische Werte in den zu vergelichenden Zeilen enthalten.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten

Beitrag von Wolfgang Ciriack »

Ich würde es so versuchen (wobei die länge 5 bei strzero natürlich angepasst werden sollte):

Code: Alles auswählen

ASort(aJuniorneu,,,{|aX,aY| strzero(aX[1],5)+strzero(aX[2],5)+strzero(aX[3],5) >strzero(aY[1],5)+strzero(aY[2],5)+strzero(aY[3],5)})
Viele Grüße
Wolfgang
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten

Beitrag von Jan »

Hallo Martin und Wolfgang,

vielen Dank für die schnellen Tipps.

Ich hatte gerade angefangen, Martins Variante einzutippen. Da kam Wolfgangs Vorschlag. Den hab ich dann genommen, weil der Code viel kürzer und übersichtlicher ist.

Vielen Dank für die Hilfe

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten [Erledigt]

Beitrag von Martin Altmann »

Auch eine Möglichkeit.
Müsste man mal benchmarken, was schneller geht. Aber bei einem "handelsüblichen" Array dürfte das keine großen Unterschiede geben.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten [Erledigt]

Beitrag von Tom »

StrZero() ist eigentlich unnötig; ein einfaches Str() genügte auch (Space ist auch kleiner als Eins). Und ich habe gebenchmarkt. Der Vergleich konkatinierter Strings (Wolfgangs Variante) ist genauso schnell (oder langsam) wie die Verwendung der If()-Funktion innerhalb des Codeblocks.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: ASort() auf mehrere Spalten [Erledigt]

Beitrag von Jan »

Hallo Tom,

Danke für den Hinweis. Der Benchmark ist natürlich eine interessante Sache. Auch die idee wäre ich nicht einmal gekommen, sowas durchzumessen.

Ich habe aber Wolfgangs Varinate nicht deswegen genommen, weil die vielleicht schneller wäre, sondern weil die einfach übersichtlicher zu lesen ist. Man muß ja auch immer daran denken, das man selber (oder noch schlimmer: Jemand anderes) den Code auch in ein paar Monaten noch lesen will, und sich dann nicht erst sich mühsam durch Klammerstrukturen durcharbeiten will um zu vestehen, was man da eigentlich irgendwann mal verzapft hat.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten