Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Tabelle - Sortieren von 1, 2, 3a, 3b, 3c, 4, 5, 6a, 6b ...
Anwender - So 08.11.15 10:06
Titel: Tabelle - Sortieren von 1, 2, 3a, 3b, 3c, 4, 5, 6a, 6b ...
Hallo,
ja, eigentlich dachte ich gestern Abend die Lösung gefunden zu haben und dann hier niemanden mehr bemühen zu müssen. :x
Aber jetzt doch:
In unserem kleinen Verein haben wir unsere Dokumente in Papp-Mappen organisiert und ich möchte dafür ne (nach Spalten ) sortierbare Inhalts-Liste als Programm erstellen.(bisher gibt's nur ne Papierliste)
Manche Mappen (1,2,3...214....223) enthalten aber aus Sparsamkeitsgründen mehrere Dokumente. (doof, ich weiß; und das soll auch noch so bleiben(!grml))
[
Hinweis zum u.g. Beispiel: Wenn ich diese (ja, ich weiß, die Mappen beginnen im Beispiel bei 214 ... der Index aber bei Eins. ..., Die Dokumenten-Titel sind real auch anders/detaillierter/länger.
Wenn ich die Mappen hier bei 1, 2,3 beginnen lasse, dachte ich, hab ich nacher Probleme beim Übertragen einer Lösung auf mein Projekt.
Ist nämlich irgendwie doch kompliziert, da sich
Unterlisten wie 3a,3b,3c etc. dabei befinden.)
(MS-Word: "Liste mit mehreren Ebenen")]
Ok, Ihr empfindet vielleicht das Problem nicht als so groß. Aber ich habe keine Informatik studiert :D
Ich muß das alles zu Fuß.
So:
Hab die Papierliste erstmal in Excel übertragen, damit man das später überhaupt digital (.csv) verarbeiten kann.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| bisheriger_Index Mappennumer Dokumententitel 1 214 Herbert 2 215 Manfred 3a 216 Caroline 3b 216 Ottilie 3c 216 Sandra 4 217 Kleo 5 218 Antje 6a 219 Dörte 6b 219 Mike 7 220 Wilfried 8 221 Jens 9a 222 Arne 9b 222 Johannes 9c 222 Mehmed 10 223 Ingo |
Ja, jetzt würde ich gerne statt nur 1,2,3a,3b,3c einen fortlaufenden index verwenden, den man schnell suchen/zugreifen kann (z.B: integer) - gerne auch in ein anderes ArrayFeld - nur, dann geht der Zusammenhang verloren, daß a,b,c alle in Mappe 3 sind.
Wenn man die Lsite benutzerdefiniert sortiern lassen will, brauche ich diesen extra Index = quasi sowas wie nen PrimaryKey.
In Excel hatte ich das testweise gelöst, indem ich in Spalte 4 noch 5 Nullen vor den Index gesetzt hab. 000001,000002,000003a, ...etc. und *ZACK!* war es wieder zuverlässig sortierbar.(dann z.B. nach Spalte D)
Funzt aber nur in Excel. Für Delphi bleiben die Buchstaben hinter den Zahlen. ...
und das zu Erkennen ginge nur mit ner Menge Code.
Hatte schon die Idee, ich lege noch ne (Array-)Spalte an, in der ich die Mappennummer vermerke, aber dann geht die interne Reihenfolge verloren. Lege ich dann noch ne weitere Spalte an nur mit Buchstaben geht der Bezug zur Mappennummer verloren und wird nur noch komplizierter.
Vielleicht kann man das ja noch eleganter lösen.
Wenn da einer ne Idee hat, wäre ich dankbar.
Ich grüble da schon 2 Tage rum.
ub60 - So 08.11.15 12:48
Anwender hat folgendes geschrieben : |
Hatte schon die Idee, ich lege noch ne (Array-)Spalte an, in der ich die Mappennummer vermerke, ... |
Die Idee ist doch ganz gut.
Wie sortierst Du denn? Hoffentlich nicht mit den Arrays? Hier bieten sich Datenbanken (z.B. SQLite) an. Dort könnte man einfach sortieren mit "SELECT * FROM Tabelle ORDER BY Mappe, Buchstabe".
ub60
GuaAck - So 08.11.15 19:07
Hallo,
wenn es ein kleiner Vrein ist, dann geht es auc mit Arrays und man braucht keine Datenbank.
Wie wäre den folgende Lösung:
Delphi-Quelltext
1:
| lfdnr := strtoint(leftstr(originalnr, length(originalnr)-1))*1000+ord (rightstr(originalnr,1)); |
originalnr wäre z. B. 3b, dass würde dann zu 3097.
Gruß GuaAck
Moderiert von Th69: Delphi-Tags hinzugefügt
Anwender - So 08.11.15 21:45
Danke Euch beiden.
Mhh, ja, mit ner Datenbank hatte ich auch überlegt.
Wobei ich dann wegen vermuteter Einfachheit dann SQlite3 mit Wrapper versuchen würde, wobei ich es bisher nicht geschafft habe, außer dem Compilieren des dem Wrapper beigelegten Programms
http://www.itwriting.com/blog/?page_id=659 irgendwas daran zu verändern oder gar eigenen Code umzusetzen. Die Syntax für den Wrapper ist darin noch etwas unübersichtlich.
(bin auch froh, daß ich mir den für unter Delphi5 lauffähig gefrickelt hab)
Firebird käme wohl auch noch in Frage, weil's idealerweise portable (ohne Einträge im System) sein soll. Aber ich glaube, da müßte man sich noch mehr einarbeiten. Hab's biser nich zum Laufen gekriegt.
Zudem steht mir hier nur mein (altes, aber geliebtes & gekauftes) Delphi 5 zur Verfügung. (ja, TurboDelphi Free könnte ich auch runterladen, allerdings sind die Quellen dafür eher unsicher)
So wäre die Lösung von GuaAck mit größeren Indexzahlen zu arbeiten naheliegender.
Allerdings hatte ich die Befürchtung daß man bei ein paar Tausend Dokumenten schnell in sehr große Zahlen (für die Mappen) kommen könnte.
OK, mehr als Hundert Dokumente je Mappe und >10.000 Mappen werden es wohl nicht.
Von daher werd' ich vermutlich letztere umsetzen.
v.a. aber auch, weil ich gerade den sqlite Wrapper nich mit eigenem Code zum Laufen kriege.
GuaAck - Mo 09.11.15 21:46
100000*100 =1 Mio. Wenn Du dann je Eintrag auf 1 kB kommst, dann hat Dein Array 1 GB. Das kann ja heute sogar ein betagter PC.
Eine Suche geht schnell, 1 Mio mal vergleichen..., da braucht kaum einen pfiffigen Algorithmus. Sortieren kann etwas dauern, gängige Algorithem tauschen dauernd zwei Einträge aus oder speichern sie um. Wenn da immer 1 kB umgespeichert wird, dann dauert das auch bei modernen PCs etwas Zeit. Einfach probieren, ggf. Zwischenliste mit Zeigern einrichten.
Ich habe übrigens nichts gegen eine Datenbank. Ich hatte mal MySQL benutzt, das ging sehr gut, auch der Zugriff von Delphi aus. Im Internet hatte ich dazu eine Demo gefunden und angepasst. Die Demo habe ich bestimmt noch, melde Dich ggf. MySQL ist eine leistungsfähige Datenbank, ich hatte damals ein TeraByte-Projekt im Blick. Für kleinere Anwendungen störte mich, dass man MySQL als Server installiert haben muss. Da ist die Array-Lösung einfacher.
Ich habe eine eigene "Array-Datenbank" mit ca. 5000 Personen mit einigen Angaben. Suche (primitiv FOR i := 0 to imax....) lief schon auf meinem Athlon800 (Bauj. 2000) ohne nennenswerte Verzögerung.
Wird gehen, viel Erfolg,
Gruß
GuaAck
Xion - Di 10.11.15 10:04
Anwender hat folgendes geschrieben : |
Wobei ich dann wegen vermuteter Einfachheit dann SQlite3 mit Wrapper versuchen würde, wobei ich es bisher nicht geschafft habe, außer dem Compilieren des dem Wrapper beigelegten Programms http://www.itwriting.com/blog/?page_id=659 irgendwas daran zu verändern oder gar eigenen Code umzusetzen.
|
Der Wrapper ist super und hat bei mir nie Probleme gemacht. SQLite ist auf jeden Fall das Mittel der Wahl, denn es benötigt keine eigene Installation.
Ansonsten würde ich so vorgehen:
1. Alle Indizes durchlaufen, vorne die Zahl abschneiden (z.B. von vorne beginnend testen, ob es sich um eine Zahl handelt). Die Zahlen und die Buchstaben in eigene Arrays packen.
2. Das Array mit den Zahlen sortieren (z.B. mit BubbleSort, ist ein 5-Zeiler). Dabei immer schön das Buchstaben-Array mit umordnen.
3. Das Array nochmal mit BubbleSort sortieren, diesesmal die Buchstaben vergleichen und nur tauschen, wenn die Zahlen gleich sind.
So hast du keine "magischen Nummern", so dass dir dann bei mehr als 1000 Einträgen alles um die Ohren fliegt. Der Code ist vermutlich mit 20 Zeilen erledigt. Effizienz-technisch lässt sich natürlich einiges machen, ist aber bei wenigen Einträgen garnicht nötig.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!