AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String/Integer Paare verwalten

Ein Thema von Shark99 · begonnen am 25. Sep 2010 · letzter Beitrag vom 26. Sep 2010
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

String/Integer Paare verwalten

  Alt 25. Sep 2010, 20:51
Delphi-Version: 7
Ich suche einen schnellen und unkomplizierten weg um String/IntegerPaare zu speichern, z.B. solche Daten

Meyer=1
Mueller=2743
Schmied=65

Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.

Eine verketette Pointerliste von Records wäre auch eine Möglichkeit, fand sie aber etwas zu kompliziert, vor allem da in anderen Sprachen solche Sachen extrem einfach sind, z.B. in Lua geht es mit mytable = {}; mytable.Meyer=1;

Am Ende bin ich bei Collections gelandet. Es ist zwar schnell, aber der Code ist doch ganz schön umständlich und mit Pech rennt man in external Exceptions rein, weil es Com Objekte sind.

Deshalb meine Frage, ob es eine schnelle Lösung für das Problem gibt (für mein nächstes Projekt dann).
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

AW: String/Integer Paare verwalten

  Alt 25. Sep 2010, 20:53
Kennt dein Delphi das generische TDictionary?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: String/Integer Paare verwalten

  Alt 25. Sep 2010, 22:09
Zur effizienten Verwaltung von Schlüssel-Wert-Paaren bietet sich eine Hashmap an. Ich habe z.B. für eines meiner aktuellen Projekte so eine implementiert, und da ich sowieso vorhatte, die früher oder später mal in der CodeLib zu veröffentlichen, kann ich das ja vorab auch hier schon mal tun. Das Hinzufügen von etwas mehr als einer Million Items schafft meine Hashmap in 0.6 Sekunden, das anschließende Auslesen all dieser Items dauert zusammen 0.4s auf meinem Rechner (Vista 32Bit, 2.4Ghz Quad, 3GB DDR-2 RAM).

Derzeit im Angebot habe ich allerdings nur eine String-String-Map und eine Widestring-Object-Map, wobei letztere recht speziell auf mein Projekt angepasst ist, sodass ich sie mal außen vor gelassen habe. Weitere Varianten wie String-Integer-Maps oder Integer-String-Maps usw. hatte ich noch vor zu implementieren, bevor ich die Klasse in der CL veröffentliche, bin aber noch nicht dazu gekommen.

Das ganze ist aber bewusst so konzipiert, dass man mit relativ wenig Aufwand neue Varianten von der Basisklasse ableiten kann. Eine String-Integer-Map sollte sich damit also auch recht einfach umsetzen lassen. Ich hänge die Sourcen mal hier an, vielleicht kannst du ja was damit anfangen.
Angehängte Dateien
Dateityp: zip Hashmap.zip (5,6 KB, 41x aufgerufen)

Geändert von Namenloser (25. Sep 2010 um 22:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: String/Integer Paare verwalten

  Alt 26. Sep 2010, 00:12
Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.
Dann versuch doch mal eine StringList, wo du den Integer als TObject gecastet in dem Objects-Property speicherst. Wenn du die StringLIst dann auf Sorted := true stellst, sollte es dann schneller gehen. Also etwa so:

Delphi-Quellcode:
list := TStringList.Create;
list.Sorted := true;
list.AddObject('Meyer', TObject(1));
list.AddObject('Mueller', TObject(2743));
list.AddObject('Schmied', TObject(65));
...
idx := list.IndexOf('Mueller');
val := Integer(list.Objects[idx]);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
taveuni
Online

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: String/Integer Paare verwalten

  Alt 26. Sep 2010, 11:24
Ich habe es zuerst mit einer StringList und .Names bzw .Values gemacht. Es funktionierte und war leicht zu implementieren, aber bei grossen Datenmengen ist es sehr langsam.
Dann versuch doch mal eine StringList, wo du den Integer als TObject gecastet in dem Objects-Property speicherst.
Und dann noch nicht Stringlist sondern THashedStringlist dann ist die Suche auch unheimlich schnell.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: String/Integer Paare verwalten

  Alt 26. Sep 2010, 16:52
Und dann noch nicht Stringlist sondern THashedStringlist dann ist die Suche auch unheimlich schnell.
Meine Hashmap ist aber schneller
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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