![]() |
nummer + Name sortieren
Ich will eine laufende Nummer u n d die ersten vier Buchstaben eines Namens mit anderen vergleichen und dann der größe nach sortieren.
Der Sortieralgorithmus läuft, aber die Umwandlung des Namens in eine Ziffernfolge (Zahl), die ich der laufenden Nummer hinzuaddieren, um dann nach diesem Index zu sortieren, klappt nicht. Also z.B. Nummer: 99 und Name: Hans Ich setze 1000*99+ [....Hans.. als Zahl], um diese Indices dann zu sortieren. vermutlich istz es ganz einfach und ich stehe nur auf dem Schlauch |
AW: nummer + Name sortieren
Ich verstehe Deine Beschreibung nicht so ganz, wie wäre es mit etwas Code?
|
AW: nummer + Name sortieren
Du kannst den Namen nicht als Zahl darstellen (welche sollte das bei "Hans" z.B. sein?).
Aber du kannst die Zahl in eine Zeichenfolge umwandeln, den Hans hinten dran hängen und das dann als Schlüssel nehmen. Lediglich die maximale Anzahl Ziffern der Zahlen muss vorher bekannt sein, damit man die rechtsbündig oder mit führenden Nullen darstellen kann.
Delphi-Quellcode:
Der obige Code z.B. liefert für Key '0099Hans'.
var
Key: string; Zahl: Integer; Stellen: Integer; Name: string; begin Zahl := 99; Stellen := 4; Name := 'Hans'; Key := Format('%.*d%s', [Stellen, Zahl, Name]); end; |
AW: nummer + Name sortieren
OT: Stimmt Delphi 8 Professional wirklich?
|
AW: nummer + Name sortieren
Hast Du denn schon einen Algorithmus für die Namensumwandlung?
Wenn nein, schau Dir mal bitte
Delphi-Quellcode:
an. Ist (bei Delphi 7) in StrUtils zu finden.
Delphi-Syntax:
function SoundExInt(const AText: string; ALength: TSoundExIntLength = 4): Integer; Wäre für Dich dann eventuell so zu lösen:
Delphi-Quellcode:
Die 1000 als Multiplikator dürfte zu klein sein, Du möchtest ja ein Ergebnis in der Form
IndexWert := (10000 * Nummer) + SoundExInt(Name,4);
Code:
haben, also sechsstellig. Aber bedenke, so wie das hier jetzt aussieht, reicht es nur für Indexwerte von 0 bis 99. Bei größeren Indexwerten musst Du die Berechnung entsprechend anpassen. Und durch die Kürzung der Namen muss nicht zwingend eine bessere Sortierung herauskommen. Paul und Pauline werden in diesem Beispiel nicht mehr unterscheidbar sein, Sortierung also eher zufällig.
99Hans
99Paul 99Paul(line) Und durch die SoundEx-Funktion werden die Meiers und Maiers und Mayers und Meyers... alle gleich. |
AW: nummer + Name sortieren
Hat irgendjemand gesagt, das diese "Nummer" auch als Zahl interpretiert werden muß?
"123"+"Hans" und gut ist. Gruß K-H |
AW: nummer + Name sortieren
Du suchst wahrscheinlich nach natural-compare ("natürlicher Vergleich").
siehe: ![]() |
AW: nummer + Name sortieren
Mein Sortieralgorithmus sieht wie folgt aus:
hier sortiere ioch nach ma.landnu und ma.mand (jeweils integer); aus verschiedenen Gründen möchte ich aber beu gleicher ma.landnr nach ma.landnu und ma.land (=Name eines Landes- string)sortieren. Das läuft noch nicht PROCEDURE tform25.SortierenvonNamenMandatszahlen1Click(Sende r: TObject); VAR ind : ARRAY[0..100] OF INTEGER; {Indexdatei} key : ARRAY[0..100] OF REAL; {komp.1+komp.2} hilfsdatei : FILE OF landmandattyp; j,y,i : INTEGER; x : REAL; BEGIN FOR i:=0 TO nn-1 DO {Initialisieren} BEGIN ind[i]:=i; seek(mandate,i); read(mandate,ma); key[i]:=10000*ma.landnu+ma.mand; END; FOR i:=1 TO nn-1 DO BEGIN x:=key[i];j:=i-1;y:=ind[i]; WHILE (x<key[j]) AND (j>=0) DO BEGIN ind[j+1] :=ind[j];key[j+1]:=key[j];j:=j-1;END; key[j+1]:=x; ind[j+1]:=y; END; {Indexe sind nun sortiert} ASSIGNfile(hilfsdatei,'hilfemandate.dat'); REWRITE(hilfsdatei); FOR i:=0 TO nn-1 DO BEGIN SEEK(mandate,ind[i]); READ(mandate,ma); WRITE(hilfsdatei,ma); END; CloseFile(hilfsdatei); closefile(mandate); Erase(mandate); try RENAME(hilfsdatei,'mandatsanzahl.dat'); except on EInOutError do messageDlg('Fehler: auf Explorer-Ebene hilfemandate.dat in mandatsanzahl.dat umbenennen',mtError,[mbOk],0); END; form2.mandateeroeffnen(sender); END;{lokal_sortieren} |
AW: nummer + Name sortieren
Hallo,
ändere doch bitte zuerst einfach die Realwerte in einen String. Aus
Delphi-Quellcode:
müsste dann
key[i]:=10000*ma.landnu+ma.mand;
Delphi-Quellcode:
werden.
Key[i] := Format('%.*d%s%s', [5, 10000 * ma.landnu, ma.mand,ma.land]);
Wenn es zwingend nur vier Zeichen des Landes sein sollen halt Copy(ma.land,1,4) nehmen. Ist jetzt nur mal so "hingedaddelt", ohne zu prüfen. |
AW: nummer + Name sortieren
Zitat:
Wenn ich das richtig verstanden habe, willst Du LandNr und LandName als Sortierkriterien nutzen. Ich gehe mal davon aus, daß die LandNr in Ihrer Wertigkeit den LandNamen entsprechen, dann wäre das Doppelt gemoppelt. Gruß K-H |
AW: nummer + Name sortieren
Die Landnummern sind integer
die landnamen sind string |
AW: nummer + Name sortieren
Die totale Ordnung über ein Tupel (a,b,c) lässt sich doch wie folgt darstellen:
Seien A=(a1,a2,a3) und B=(b1,b2,b3) zwei 3-Tupel. Dann gilt: A<B <=> a1<b1 oder (a1=b1 und b1<b2) oder (a1=b1 und b1=b2 und c1<c2) A=B <=> a1=b1 und a2=b2 und a3=b3 A>B sonst So. Man muss hier nichts konvertieren, in Zahlen umwandeln oder sonst. Einfach die 'Compare'-Funktion entsprechend o.g. Regel definieren und fertig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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