Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   nummer + Name sortieren (https://www.delphipraxis.net/174967-nummer-name-sortieren.html)

Hartfrid Krause 22. Mai 2013 12:20

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

DeddyH 22. Mai 2013 12:27

AW: nummer + Name sortieren
 
Ich verstehe Deine Beschreibung nicht so ganz, wie wäre es mit etwas Code?

Uwe Raabe 22. Mai 2013 12:36

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:
var
  Key: string;
  Zahl: Integer;
  Stellen: Integer;
  Name: string;
begin
  Zahl := 99;
  Stellen := 4;
  Name := 'Hans';
  Key := Format('%.*d%s', [Stellen, Zahl, Name]);
end;
Der obige Code z.B. liefert für Key '0099Hans'.

Uwe Raabe 22. Mai 2013 12:37

AW: nummer + Name sortieren
 
OT: Stimmt Delphi 8 Professional wirklich?

nahpets 22. Mai 2013 12:48

AW: nummer + Name sortieren
 
Hast Du denn schon einen Algorithmus für die Namensumwandlung?

Wenn nein, schau Dir mal bitte
Delphi-Quellcode:
Delphi-Syntax:

function SoundExInt(const AText: string; ALength: TSoundExIntLength = 4): Integer;
an. Ist (bei Delphi 7) in StrUtils zu finden.

Wäre für Dich dann eventuell so zu lösen:
Delphi-Quellcode:
IndexWert := (10000 * Nummer) + SoundExInt(Name,4);
Die 1000 als Multiplikator dürfte zu klein sein, Du möchtest ja ein Ergebnis in der Form
Code:
99Hans
99Paul
99Paul(line)
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.

Und durch die SoundEx-Funktion werden die Meiers und Maiers und Mayers und Meyers... alle gleich.

p80286 22. Mai 2013 13:13

AW: nummer + Name sortieren
 
Hat irgendjemand gesagt, das diese "Nummer" auch als Zahl interpretiert werden muß?
"123"+"Hans" und gut ist.

Gruß
K-H

sx2008 22. Mai 2013 13:16

AW: nummer + Name sortieren
 
Du suchst wahrscheinlich nach natural-compare ("natürlicher Vergleich").
siehe: http://www.delphipraxis.net/1181699-post21.html

Hartfrid Krause 22. Mai 2013 13:51

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}

nahpets 22. Mai 2013 14:20

AW: nummer + Name sortieren
 
Hallo,

ändere doch bitte zuerst einfach die Realwerte in einen String.
Aus
Delphi-Quellcode:
key[i]:=10000*ma.landnu+ma.mand;
müsste dann
Delphi-Quellcode:
Key[i] := Format('%.*d%s%s', [5, 10000 * ma.landnu, ma.mand,ma.land]);
werden.
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.

p80286 22. Mai 2013 14:27

AW: nummer + Name sortieren
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1216066)
aus verschiedenen Gründen möchte ich aber beu gleicher ma.landnr nach ma.landnu und ma.land (=Name eines Landes- string)sortieren.

???
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:12 Uhr.
Seite 1 von 2  1 2      

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