AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?

Ein Thema von Der_Ventilator · begonnen am 17. Dez 2005 · letzter Beitrag vom 28. Dez 2005
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#1

Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?

  Alt 17. Dez 2005, 19:12
Hi, ich möchte einige Strings in eine logisch richtige Reihenfolge bringen (das das der Explorer ab WinXP auch macht).

Also nicht

bla-1-bla
bla-2-bla
bla-21-bla
bla-3-bla

(was ein 'normaler' Sortieralgorithmus, wie z.B. Quicksort, machen würde),

sondern

bla-1-bla
bla-2-bla
bla-3-bla
bla-21-bla

Im Grunde läuft alles darauf hinaus, nicht die < und > Vergleichsoperatoren von Delphi zu verwenden, sondern eine eigene isLower( , ):boolean Funktion zu schreiben.

Hab mir das so gedacht:

Haben die Strings 200 Zeichen, dann erstelle ich mir ein int-Array mit 200 Spalten und belege jede Zelle mit dem Ord( ) Wert der einzelnen Buchstaben des Strings und bei Zahlen (wenn mehrere Ziffern hintereinander stehen, zusammenfassen!) werden diese direkt hineingeschrieben; dann erfolgt solange Spaltenweise der Vergleich, bis ein Unterschied festzustellen ist.
Sind meine Überlegungen richtig bzw. hat schon eine solche Stringvergleichsprozedur geschrieben (die evtl schneller als meine ist)?
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#2

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 19:27
Wie wäre es, den numerischen Teil vom Rest des Strings irgendwie zu trennen und nur, wenn bei der Zahl Gleichheit besteht, den Reststring zum Vergleich mit < > heranzuziehen?
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 19:40
Das Problem ist, das die Strings nicht ganz so gleichförmig sind, wie ich es dargestellt habe:

Es geht um einen Mp3-Player, der Albumname + Tracknummer + Songtitel in einer Zeile ausgibt (id3 tag).

Nun sind ja die nichtnumerischen Teile nicht immer gleich lang (verschiedene Bandnamen usw). Deshalb müsse ich mir bei der Trennung dann noch zusätzlich die Position merken, wo die Zahlen ursprünglich waren, was ich mit meinen Spaltenindizes machen möchte.
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 19:45
Dann würde ich an deiner Stelle einfach den numerischen Teil aus den Strings auslesen und dann danach sortieren.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Der_Ventilator

Registriert seit: 11. Apr 2004
Ort: Kanada
136 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 19:53
Ich erstelle zur Zeit erst ein Liste aller Einträge.
Diese wird dann per Quicksort sortiert.
Nun sind da aber schon alle verschiedenen Alben bzw Bandnamen verarbeitet.
Wenn ich jetzt nur nach Nummern sortiere, reise ich mir doch die Alben auseinander.

Ich suche einfach eine schnelle Funktion, die 2 Strings nach oben genanneter Logik vergleicht.
Evtl. eine, die sogar ein 'Ü' als 'U' interpretiert.
Codito, ergo sum. - I code therefore I am
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 20:12
Hi,
benutz einfach ein wenig topologisches Sortieren (hoffe ich vertue mich da nicht mit dem Namen, die liegen schon zurück).
Pack einfach alle Tracks eines Albums (oder Interpreten oder was auch immer du als primäres Sortierkriterium hast) in je eine Liste ein.
Diese Liste Sortierst du dann nach dem sekundären Sortierkriterium (hier also die Tracknummer), dann bekommst du also sowas wie
1.
Album1-1 -> Album1-10 -> Album1-2...
Album2-1 -> Album2-10 -> Album2-2...
...
2.
Album1-1 -> Album1-2 -> Album1-10....
Album2-1 -> Album2-2 -> Album2-10....

Jetzt weißt du das die Listen jeweils richtig sortiert sind und muss nur noch in der Reihenfolge der Listen einfügen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 20:22
Meinst du vielleicht ein "stabiles" Sortierverfahren?
MergeSort wäre zB ne Möglichkeit. Das hat im übrigen auch bei großen Datenmengen ne bessere Laufzeit als dein Quicksort. Das hat nämlich im worst Case O(n²), MergeSort nur O(n*logn).
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 20:40
Grundsätzlich musst Du einfach nur eine Ordnung auf die Titel definieren. Das erreichst Du mit einer Funktion 'CompareTitle (a,b)', das für zwei Titel a und b einen Wert liefert, der angibt, ob a nun vor b, danach oder identisch mit b ist.

Das Sortierverfahren dürfte hier keine grosse Rolle spielen, denn ob nun Merge-, Quick-, Bubble-, Heap-, Shaker- oder was weiss ich was-Sort, Alle Verfahren bauen auf der o.g. Funktion auf.

Der 'topologische' Ansatz ist zwar vom Gedankengang richtig klassifiziert, aber topologisches Sortieren basiert auf Graphen, wobei ich nicht vorschlage, die Titelliste in einen Graphen zu übertragen. Es wäre wohl eher eine Unterteilung in Ebenen. Also, erst alle Titel in Albem unterteilen und dann jedes Album getrennt 'heuristisch-numerisch' sortieren. Anschließend die Alben noch (z.B. alphabetisch) sortieren. Vielleicht die Alben wieder in Genres und Musikstile unterteilen und dann sortieren etc.

Das *kann* man durchaus mit einem Sortiervorgang machen. Dazu musst du aber wissen, wo der Albentitel im String steckt. Hier mal ein ziemlich abstrakter Pseudocode für die zentrale Vergleichsfunktion:
Delphi-Quellcode:
Function CompareTitle (TitleA, TitleB : String) : Integer;
Var
  AlbumA, AlbumB : String;

Begin
  Result := CompareText (ExtractAlbumFromTitle (TitleA), ExtractAlbumFromTitle (TitleB));
  If Result<>0 Then Exit;
// Beide Titel sind vom selben Album
  Result := CompareText (ExtractSongNumberFromTitle (TitleA), ExtractSongNumberFromTitle (TitleB));
End;
Dann kannst Du alle Titel in eine Stringliste reinpacken und per CustomSort sortieren. Dieser Methode übergibst Du dann o.g. Funktion als Parameter. Ob die genauso aussehen muss, weiss ich nicht, aber wozu gibts die Online-Hilfe.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 20:49
Zitat von alzaimar:
Das Sortierverfahren dürfte hier keine grosse Rolle spielen, denn ob nun Merge-, Quick-, Bubble-, Heap-, Shaker- oder was weiss ich was-Sort, Alle Verfahren bauen auf der o.g. Funktion auf.
Also den Unterschied von QuickSort zu MergeSort merkst du bei entsprechend großen Datenmengen sehr wohl. Die Frage ist eben, wieviele Titel er in seiner Liste hat

Zitat von alzaimar:
Der 'topologische' Ansatz ist zwar vom Gedankengang richtig klassifiziert, [...]
Wie gesagt, ich denke, er meinte ein stabiles Sortierverfahren, so daß ein erneutes Sortieren nach einem anderen Kriterium die Reihenfolge früherer Sortierkriterien beibehält.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 17. Dez 2005, 21:03
Zitat von leddl:
Also den Unterschied von QuickSort zu MergeSort merkst du bei entsprechend großen Datenmengen sehr wohl. Die Frage ist eben, wieviele Titel er in seiner Liste hat
Nee, is klar. Ich wollte eher auf die Erwähnung von Quicksort und Mergesort eingehen.

Aber: Vergleiche mal die Quick- mit Mergesort, wenn die Daten sich auf (langsamen) Datenträgern befinden (File Of TMyRecord). *Dann* merkst Du den Unterschied. Das Ergebnis wird aber nicht das sein, was Du erwartest.
Übrigens ist laut der grauen Theorie Mergesort im Gegensatz zu Quicksort vom Laufzeitverhalten auch im Worst-Case-Bereich optimal. Davon merkt man beim In-Memory-sortieren zwar Nichts, aber beim externen Sortieren sehr wohl: Dafür wurde Mergesort (Stichwort: Bänder) auch entwickelt.

Zitat von leddl:
Zitat von alzaimar:
Der 'topologische' Ansatz ist zwar vom Gedankengang richtig klassifiziert, [...]
Wie gesagt, ich denke, er meinte ein stabiles Sortierverfahren, so daß ein erneutes Sortieren nach einem anderen Kriterium die Reihenfolge früherer Sortierkriterien beibehält.
Das macht "Topologisches Sortieren"? Ich dachte immer, das sortiert nur einen Graphen. Welches Sortierverfahren behält 'die Reihenfolge früherer Sortierkriterien' nach erneutem 'Sortieren nach einem anderen Kriterium' bei? Ich kenne Datenstrukturen, die das machen, aber keine Sortierverfahren. Ach, auch egal. Wir wissen ja, was gemeint ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 23:51 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