2010-05-19 7 views
16

Esiste un qualche tipo di implementazione della mappa nativa in delphi 6 (chiavi della mappa per valori e oggetti) - Internet non è stato di aiuto fino ad ora. Ho appena scaricato un progetto delphi su my, il mio background è C++ e java, e il precedente dev del progetto delphi esegue linearmente tutte le ricerche.C'è qualcosa come una mappa o una tabella hash in Delphi 6?

Grazie.

+2

Per quello che stai cercando di fare, in Delphi 6, andrei con la risposta di Andreas, ma TStringList è un po 'limitato. Se vuoi veri contenitori generici come puoi trovare nel C++ STL, hai bisogno di Delphi 2010. (Sono stati introdotti in Delphi 2009, ma con alcuni difetti che non sono stati risolti fino alla prossima versione.) L'implementazione della mappa generica è chiamata TDictionary, nell'unità Generics.Collections. –

risposta

10

In base alle proprie esigenze, è possibile utilizzare l'oggetto TStringList.

+0

Sto solo cercando di mappare una stringa su un'altra stringa: map.put ("apple", "round looking fruit"); map.get ("mela"); // restituisce "round looking fruit" – LoudNPossiblyWrong

+4

TStringlist può fare ciò: usa 'MyStringlist.Values ​​['apple']: = 'round cercando fruit';' per assegnare e 'S: = MyStringlist.Values ​​['apple'];' leggere – mjn

+0

+1 TStringList utilizza una ricerca binaria per le ricerche dopo che è stata ordinata. –

4

Jedi Code Library contiene alcune classi contenitore avanzate. Le interfacce sono dichiarati in JclContainerIntf.pas, ad esempio:

IJclMap = interface(IJclContainer) 
    ['{A7D0A882-6952-496D-A258-23D47DDCCBC4}'] 
    procedure Clear; 
    function ContainsKey(Key: TObject): Boolean; 
    function ContainsValue(Value: TObject): Boolean; 
    function Extract(Key: TObject): TObject; 
    function GetValue(Key: TObject): TObject; 
    function IsEmpty: Boolean; 
    function KeyOfValue(Value: TObject): TObject; 
    function KeySet: IJclSet; 
    function MapEquals(const AMap: IJclMap): Boolean; 
    procedure PutAll(const AMap: IJclMap); 
    procedure PutValue(Key, Value: TObject); 
    function Remove(Key: TObject): TObject; 
    function Size: Integer; 
    function Values: IJclCollection; 
    property Items[Key: TObject]: TObject read GetValue write PutValue; 
     {$IFNDEF BUGGY_DEFAULT_INDEXED_PROP} default; {$ENDIF ~BUGGY_DEFAULT_INDEXED_PROP} 
    end; 
+0

sai se esiste una libreria nativa che posso usare? Sto cercando di evitare di aggiungere un'altra libreria al progetto. – LoudNPossiblyWrong

+2

Rispetto a Java, la libreria Core Run Time è piuttosto piccola in Delphi. Esistono alcune classi contenitore di livello superiore per gli oggetti (come TObjectList e TInterfaceList) ma non molto altro. – mjn

5

Ho testato TStringList e alcune implementazioni THashTable e le differenze tra i due implementazioni sono minime, e nella maggior parte dei casi TStringList (con attuazione sorta dicotomical) sono più efficienti di THashTable.
Per un numero limitato di valori TStringList è più veloce di Hash e per un numero elevato di valori è necessario trovare una complessa funzione hash per ridurre al minimo la collisione e questa complessità riduce l'efficienza di HashList.

È necessario utilizzare il puntatore Oggetto di StringList per archiviare tutte le informazioni necessarie (seconda stringa).

Saluti.

+0

Grazie Mason. ;-) –

7

Ive usato una libreria chiamata Hashes.pas da Ciaran McCreesh ma dal momento che il suo sito web non è più disponibile, è possibile vedere il file PAS singolo dal seguente URL:

Link to Cian McCreesh - Hashes.pas

si possono anche trovare con Google con il testo: "Cian McCreesh Hash"

con questa libreria è possibile effettuare le seguenti operazioni:

aString := TStringHash.Create; 
aString['color'] := 'blue'; 
ShowMessage(aString.Items['color']); // blue 

O r oggetti:

aObj := TObjectHash.Create; 
aObj['color'] := TBlueClass.Create; 
bcBlue:=(aObj.Items['color'] as TBlueClass); 
ShowMessage(bcBlue.Name); // Blue (supposing the TBLusClass as a Name property... 

Spero che serva per te.

PS Penso che anche il progetto Ares AudioGalaxy lo utilizzi.

+1

L'ho copiato dalla cache di Google qui: http://pastebin.com/HkWAGFbe. Spero che a Ciaran non dispiacerà. –

Problemi correlati