2010-05-19 5 views
16

¿Hay algún tipo de implementación de mapa nativo en delphi 6 (claves de mapa para valores y objetos)? Internet no ha sido de ayuda hasta ahora. Acabo de obtener un proyecto delphi volcado en mi, mi fondo es C++ y Java, y el desarrollador anterior del proyecto delphi hace toda la búsqueda linealmente.¿Hay algo como un mapa o una tabla hash en Delphi 6?

Gracias.

+2

Por lo que estás tratando de hacer, en Delphi 6, me gustaría ir con la respuesta de Andreas, pero TStringList es un poco limitado. Si desea contenedores genéricos verdaderos como los que puede encontrar en C++ STL, necesita Delphi 2010. (Fueron presentados en Delphi 2009, pero con algunas fallas que no se corrigieron hasta la próxima versión). La implementación del mapa genérico se llama TDictionary, en la unidad Generics.Collections. –

Respuesta

10

Dependiendo de sus necesidades exactas, es posible que desee utilizar el objeto TStringList.

+0

Solo estoy buscando asignar una cadena a otra cadena: map.put ("manzana", "fruta de aspecto redondo"); map.get ("apple"); // devuelve "fruta de aspecto redondo" – LoudNPossiblyWrong

+4

TStringlist puede hacer esto: use 'MyStringlist.Values ​​['apple']: = 'round look fruit';' para asignar y 'S: = MyStringlist.Values ​​['apple'];' para leer – mjn

+0

+1 TStringList utiliza una búsqueda binaria para búsquedas cuando está ordenada. –

4

El Jedi Code Library contiene algunas clases avanzadas de contenedores. Las interfaces se declaran en JclContainerIntf.pas, por ejemplo:

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

¿sabes si hay una biblioteca nativa que puedo usar? Estoy tratando de evitar agregar otra biblioteca al proyecto. – LoudNPossiblyWrong

+2

En comparación con Java, la biblioteca de tiempo de ejecución central es bastante pequeña en Delphi. Hay algunas clases de contenedor de nivel superior para objetos (como TObjectList y TInterfaceList) pero no mucho más. – mjn

5

He probado TStringList y algunas implementaciones THashTable y las diferencias entre las dos implementaciones son mínimos, y en la mayoría de los casos TStringList (con aplicación especie dicotomical) son más eficientes que la tableta
Para una pequeña cantidad de valores TStringList es más rápido que Hash, y para una gran cantidad de valores, debe encontrar una compleja función hash para minimizar la colisión, y esta complejidad disminuye la eficacia de la HashList.

Debe utilizar el Objeto puntero de StringList para almacenar toda la información que necesita (la segunda cadena).

Atentamente.

+0

Gracias Mason. ;-) –

7

he utilizado una biblioteca llamada Hashes.pas de Ciaran McCreesh pero desde su página web ya no está disponible se puede ver el archivo PAS sencillo de la siguiente URL:

Link to Cian McCreesh - Hashes.pas

También puede encontrar con Google con el texto: "Cian McCreesh Hashes"

con esta librería se puede hacer lo siguiente:

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

O r objetos:

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

Espero que te sirva tanto como a mí.

PD Creo que el proyecto Ares AudioGalaxy también lo usa.

+1

Lo he copiado de la memoria caché de Google aquí: http://pastebin.com/HkWAGFbe. Con suerte, a Ciaran no le importará. –