Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 15.08.05 18:03 
Hallo, ich habe einen MP3 Player gebastelt und hatte das Problem dass man diesen nicht sortieren konnte, wollte zuerst ein array nehmen mit den Infos (Titel und Interpret) und den Dateinamen, das klappte zuerst nicht, also habe ich zwei listboxen genommen. jetzt bin ich doch auf ein array umgestiegen, weil man die playlist ja sortieren können soll, manuell oder automatisch, nun das "problem":

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  MP3 = record
    Info: string;
    Filename: string;
  end;

ausblenden Delphi-Quelltext
1:
MP3s: array of MP3;					


MP3s sollte immer um 1 größer sein als tatsächlich gefüllt, da die Länge anfangs auf 1 steht, dann kommt der inhalt rein und dann wird increased für die nächste mp3.

jetzt möchte ich dieses array alphabetisch bzw ordinal nach dem inhalt von MP3s[x].Info sortieren, da steht jetzt aber schon sowas drinne:

Zitat:

Manowar - Warriors Of The World United

Jetzt muss ich gucken wie ich das mit dem Sortieren mache, ich werde wohl Interpret und Titel trennen und dann wahlweise nach Interpret oder Titel sortieren, was aber, wenn ich dann nach beidem sortieren will ? Muss ich dann das sortierte nochmal Sortieren ?

Naja auf jedenfall brauche ich dafür einen möglichst schnellen Algo, ich habe daran gedacht, jeden buchstaben ordinal umzuwandeln, und dann alle strings zeichen für zeichen zu prüfen, aber ich denke nicht, dass das sonderlich schnell ist und der eigentliche Sortiervorgang ist dann da auch noch nicht drin, wie mache ich das am besten ?

Vieeelen Dank schonmal

MFG

F34r0fTh3D4rk a.k.a. Der Dunkelfürchter
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 15.08.05 18:09 
du kannst ganz einfach stringvergleiche nehmen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
a := 'hallo';
b := 'test';


if b > a then tausche...



wenn nach beidem sortiert werden soll einfach die strings zu einem vorher zusammenfügen

sortieralgo: Quicksort (sollte im forum dazu schon genug beiträge geben, beispiel hat auch broland beigelegt unter Demos\Threads)

und die daten nicht vorher teilen einfach das array an den qucksort übergeben und halt davon nur name, song, bzw beides vergleichen und dann den ganzen record vertauschen

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 15.08.05 18:14 
also ist:
ausblenden Delphi-Quelltext
1:
a < b					

und
ausblenden Delphi-Quelltext
1:
abc < bcd < cde					


oder wie darf ich das verstehen ? dann kann ich meinen kleinen zahlensoriteralgo nähmlich ganz leicht umstellen :?

Klappt, dankeschön :D :wink: :mrgreen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure MP3Sort(var MP3A: array of MP3);
  procedure P_MP3Sort(var MP3A: array of MP3; iLo, iHi: integer);
  var
    Lo, Hi: integer;
    T, Mid: string;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := MP3A[(Lo + Hi) div 2].Info;
    repeat
      while MP3A[Lo].Info < Mid do
        Inc(Lo);
      while MP3A[Hi].Info > Mid do
        Dec(Hi);
      if Lo <= Hi then
        begin
          T := MP3A[Lo].Info;
          MP3A[Lo].Info := MP3A[Hi].Info;
          MP3A[Hi].Info := T;
          Inc(Lo);
          Dec(Hi);
        end;
    until
      Lo > Hi;
    if Hi > iLo then
      P_MP3Sort(MP3A, iLo, Hi);
    if Lo < iHi then
      P_MP3Sort(MP3A, Lo, iHi);
  end;
begin
  P_MP3Sort(MP3A, Low(MP3A), High(MP3A) - 1);
end;


Zuletzt bearbeitet von F34r0fTh3D4rk am Mo 15.08.05 18:24, insgesamt 1-mal bearbeitet
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 15.08.05 18:17 
ja das stimmt, kannst ja testen

a und b sind strings

d.h. es werden sie original ascii werte verglichen

'hallo' < 'test' < 'zuli'

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 15.08.05 18:19 
Ich DENKE du musst erstmal UpperCasen und dann die Buchstaben per ord() in Zahlen verwandeln; oder kann man tatsächlich Strings numerisch mit einander vergleichen? :shock:

edit: WUI das ist praktisch! Wusste ich garnicht!

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 15.08.05 18:25 
hab oben die lösung editiert (garnet gemerkt dass schon wieder jemand geantwortet hat :mrgreen: )

also so funzt es (etwas verbessert und einen fehler behoben ;) ):
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure MP3Sort(var MP3A: array of MP3);
  procedure P_MP3Sort(var MP3A: array of MP3; iLo, iHi: integer);
  var
    Lo, Hi: integer;
    T, F, Mid: string;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := MP3A[(Lo + Hi) div 2].Info;
    repeat
      while MP3A[Lo].Info < Mid do
        Inc(Lo);
      while MP3A[Hi].Info > Mid do
        Dec(Hi);
      if Lo <= Hi then
        begin
          T := MP3A[Lo].Info;
          F := MP3A[Lo].Filename;
          MP3A[Lo].Info := MP3A[Hi].Info;
          MP3A[Lo].Filename := MP3A[Hi].Filename;
          MP3A[Hi].Info := T;
          MP3A[Hi].Filename := F;
          Inc(Lo);
          Dec(Hi);
        end;
    until
      Lo > Hi;
    if Hi > iLo then
      P_MP3Sort(MP3A, iLo, Hi);
    if Lo < iHi then
      P_MP3Sort(MP3A, Lo, iHi);
  end;
begin
  if High(MP3A) > 1 then
    P_MP3Sort(MP3A, Low(MP3A), High(MP3A) - 1);
end;