Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi sortieren von Adressdaten - ohne DB (https://www.delphipraxis.net/183320-sortieren-von-adressdaten-ohne-db.html)

BMI 31. Dez 2014 20:08

sortieren von Adressdaten - ohne DB
 
Hi,

vermutlich wird hier erst wieder einer antworten, wenn der Rausch ausgeschlafen ist :D
aber egal.

Ich verwende Delphi 7 Std.


aalso: Ich möchte Adressdaten sortieren:
und zwar hab ich bisher folgende Listen verwendet - wobei ich mir vorstellen könnte, daß Profis das in Records umsetzen würden - welche ich als Anfänger aber noch nicht so gut umsetzen kann:

Nachname (String, bis 60 Zeichen)
Geburtsdatum+Zeit (Integer oder double, hatte bisher integer*10000)
Faktor (integer)

Bsp:
Meier-Müller
23.12.1954 13:34
897

Czervinski
04.02.1978 09:12
1204


Eigentlich bestimmt ne ganz triviale Aufgabe - die einfach nach Spalten (Name, GeburtsdatZeit oder Faktor sortieren zu können) per klick.

Aber ich hab's nicht geschafft, weil alle das nur mit Integer-Arrays - oftmals sogar nur als eindimensionale umgesetzt haben.
Und ich hab für alle 3 bisher Stringlisten angelegt, weil ich die leichter in einer Datei speichern und laden konnte. Und dann bei bedarf strtoint() konvertiert.
Das ist aber sicherlich auch nicht die schnelle Art.

Dabei hab ich aber noch die Strings in der ersten Spalte, die ja auch noch verglichen werden müßten. Die Integer wären ja einfacher mit dem unten beschriebenen Code umsetzbar.


Delphi-Quellcode:

funtion StringCompare (StringA, StringB: String ): bool;
var i: integer;
    S, t: String;
begin
    for i = 1 do length(StringA) begin
      if ord(StringA[i]) < ord(StringB[i]) then result := 1 else result := 0;
    end
end;

procedure ShellSort(var aSort: array of integer);
var
  iI, iJ, iK,
  iSize: integer;
  wTemp: integer;
begin
  iSize := High(aSort);
  iK := iSize shr 1;
  while iK > 0 do
  begin
    for iI := 0 to iSize - iK do
    begin
      iJ := iI;
      while (iJ >= 0) and (aSort[iJ] > aSort[iJ + iK]) do
      begin
        wTemp := aSort[iJ];
        aSort[iJ] := aSort[iJ + iK];
        aSort[iJ + iK] := wTemp;
        if iJ > iK then
          Dec(iJ, iK)
        else
          iJ := 0
      end;
    end;
    iK := iK shr 1;
  end;
end;
Hat da vielleicht noch jemand was, was man leichter umsetzen/implementieren kann?
Herzlichen Dank.
Das Projekt ist für mich privat - nicht direkt kommerziell - d.h. es erleichtert mir einfach persönlich nur den Umgang mit den Daten, wird aber nicht verkauft o.ä.

himitsu 31. Dez 2014 20:22

AW: sortieren von Adressdaten - ohne DB
 
Man kann Strings genauso wie Integer mit <, > und = vergleichen.

Man kann aber auch Funktionen ala Delphi-Referenz durchsuchenCompareStr/Delphi-Referenz durchsuchenCompareText benutzen.

Bei < tauscht man, bei > macht man nix und bei = wird der nächste Wert verwendet ... wieder bei < tauschen, bei > nix und bei = ab zum nächsten Wert.
Nachname -> Name -> ...

Jeder Buchstabe einzeln ist allerdings bissl übertrieben, aber wenn du das unbedingt so machen willst, dann geht das nach dem selben Prinzip.
Deine StringCompare ist aber kappt, denn du mußt natürlich beim ersten ungleichen Zeichen die Schleife abbrechen, da sonst natürlich nur der letzte Buchstabe verglichen wird.
'ABCX' ist bei deiner Fuktion natprlich das Selbe wie 'DEFX', da für X=X zuletzt das Result gesetzt wurde.
erster Buchstabe: bei kleiner Abbruch mit -1, bei größer Abbruch mit +2 und bei gleich ab zum zweiten Buchstaben usw.

Und dann muß es natülich auch knallen, wenn deine Strings nicht gleich lang sind ... speziell dann, wenn StringB kürzer ist, da du ja ausschließlich auf Length(StringA) achtest.

Brunhilde 31. Dez 2014 20:54

AW: sortieren von Adressdaten - ohne DB
 
Hallo,

StringCompare läuft gegen einen sehr dicken Baum. Es gibt String Vergleichs Funktionen. Dann wird es ein einzeiler. Ein letztes Zeichen bestimmt das Ergebnis.

In (Deiner) ShellSort steht iK := iSize shr 1; kann 0 ergeben obwohl etwas da sein könnte.
Zum Arrays sortieren gibt es fertige Funktionen, wird dann auch ein einzeiler.

Benutze für solche Probleme eine Datenbank mit einem Index auf die Spalten.

Guten rutsch.

Perlsau 1. Jan 2015 08:15

AW: sortieren von Adressdaten - ohne DB
 
@BMI: Ich würde dir da mal das Sortierkino empfehlen.

p80286 1. Jan 2015 12:22

AW: sortieren von Adressdaten - ohne DB
 
Zitat:

Zitat von BMI (Beitrag 1285081)
aalso: Ich möchte Adressdaten sortieren:
und zwar hab ich bisher folgende Listen verwendet - wobei ich mir vorstellen könnte, daß Profis das in Records umsetzen würden - welche ich als Anfänger aber noch nicht so gut umsetzen kann:

Woran hapert es denn da?

Dein Problem wäre z.B. mit einer Tlist, einem Record und einer entsprechenden Vergleichsfunktion relativ einfach zu erschlagen. Und Du kannst ohne eine DB eine recht große Anzahl von Datensätzen verwalten.
Für eine kleine Menge oder als QuicknDirty-Lösung mag der "Adress-String" funktionieren, aber empfehlenswert ist er nicht unbedingt. Zudem ist der Aufwand (beim Tippen) um den String für die Vergleichsoperation aufzubereiten ähnlich groß wie bei der Record-Lösung.

U.U. wäre auch ein Binärer-Baum erwägenswert, da dieser gleich eine Sortierung mit sich bringt.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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