2009-07-17 5 views
2

Ich habe eine Anwendung, die Dateien auf dem Computer (konfigurierbarer Pfad, Typ usw.) durchsucht. Derzeit fügt es Informationen zu einer Datenbank hinzu, sobald eine übereinstimmende Datei gefunden wird. Statt dessen möchte ich die Information im Speicher für weitere Manipulation halten, bevor sie in die Datenbank eingefügt wird. Die Liste kann viele Elemente enthalten. Ich betrachte Leistung als wichtigen Faktor. Ich muss möglicherweise durch die Elemente iterieren, so dass eine Struktur, die leicht codiert werden kann, ein anderes Schlüsselproblem ist. und wie kann ich assoziative Arrays im PHP-Stil für diesen Job erreichen?Welcher Datatyp/Struktur zum Speichern von Dateilisten-Informationen?

Antwort

1

Probieren Sie den AVL-Tree von http://sourceforge.net/projects/alcinoe/ als assoziative Array. Es hat eine Iterate-Methode für schnelle Iteration. Sie müssen möglicherweise von seiner Basisklasse ableiten und Ihren eigenen Komparator implementieren, aber es ist einfach zu bedienen.

Beispiele sind enthalten.

4

Wenn Sie Delphi 2009 verwenden, können Sie ein TDictionary verwenden. Es benötigt zwei generische Parameter. Der erste sollte eine Zeichenfolge für den Dateinamen sein und der zweite wäre der Datentyp, mit dem Sie verknüpft sind. Es hat auch drei eingebaute Enumeratoren, einen für Schlüssel-Wert-Paare, einen nur für Schlüssel und einen nur für Werte, was die Iteration vereinfacht.

3

Eine andere Lösung wäre, nur eine standardmäßige TStringList zu verwenden.

Solange es sortiert ist und einige andere Einstellungen als dupAccept enthält, können Sie indexof oder indexofname verwenden, um Elemente in der Liste schnell zu finden.

Es verfügt auch über den Zusatz "Objects", mit dem Sie Objektinformationen, die an den Namen angehängt sind, speichern können. Ab TS2009 verfügt TStringList über die OwnsObject-Eigenschaft, mit der Sie die Objektbereinigung an die TStringList delegieren können. Vor D2009 müssen Sie selbst damit umgehen.

2

Viel davon hängt davon ab, wie Sie die Liste verwenden und in welchem ​​Umfang. Wenn Sie es als Stapel oder Warteschlange verwenden möchten, würde ein TList funktionieren. Wenn Sie die Liste nach einem bestimmten Element durchsuchen müssen, benötigen Sie etwas, das ein schnelleres Abrufen ermöglicht. TDictionary (2009) oder TStringList (vor 2009) wäre die wahrscheinlichste Wahl.

Dynamische Arrays sind auch eine Möglichkeit, aber wenn Sie sie verwenden, sollten Sie die Verwendung von SetLength minimieren, da es jedes Mal, wenn es aufgerufen wird, Speicher neu zuordnen wird. TList verwaltet dies für Sie, weshalb ich eine TList vorgeschlagen habe. Wenn Sie wissen, mit wie viel Sie im Voraus zu tun haben, verwenden Sie ein dynamisches Array und legen Sie seine Länge auf den Beginn fest.

Wenn Sie mehr Elemente haben, als in den Speicher passen, ändern sich auch Ihre Auswahlmöglichkeiten. An diesem Punkt würde ich entweder eine Datenbanktabelle oder einen tFileStream verwenden, um die zu verarbeitenden Datensätze zu speichern, und dann den Anfang der Tabelle/des Datenstroms zur Verarbeitung suchen.

Verwandte Themen