2011-04-04 24 views
12

tengo código java llenando un hashmap de un archivo de texto.
HashMap<String, String[]> data = new HashMap<String, String[]>();delphi hashmap?

uso esto para hacer pares de valores-clave. los valores son una matriz de cadena. Tengo que iterar sobre todos los combo posibles de los pares clave-valor (así también tengo que iterar sobre el String [] - array). Esto funciona con Java pero ahora tengo que portar esto a Delphi. es posible hacerlo? ¿y cómo? gracias!

+2

Uso Generics.Collections.TDictionary

Respuesta

16

En Delphi 2009 y superior, puede utilizar TDictionary<string, TStringlist> utilizando Generics.Collections.

En versiones anteriores, puede utilizar TStringList donde cada elemento de la TStringList tiene un valor de objeto asociado TStrings tipo.

El Docwiki tiene una página de get started with TDictionary

+0

oh, gracias. esto se ve bien ¿Hay iteradores para esto? en Java i utilizar un método recursivo que me da cada combinación de relación calidad-pares de claves (nota: los valores son una StringList en Delphi-contexto ...) – someuser

+0

Se puede utilizar para enumerar en los pares de valores clave –

+0

mi código es similar así (lo encontré aquí en stackoverflow): http://stackoverflow.com/questions/5322948/recursive-iterate-hashmap. ¿Cómo se traduce esto a Delphi? – someuser

3

Si tiene una versión anterior de Delphi (Delphi 6 en adelante), también se puede utilizar un matriz dinámica de registro, entonces nuestro TDynArray o TDynArrayHashed envolturas para crear un diccionario con un campo de los registros de matriz dinámica. Ver this unit.

La envoltura TDynArrayHashed fue desarrollado para ser rápido.

Aquí algunos ejemplos de código (de pruebas unitarias suministrados):

var ACities: TDynArrayHashed; 
    Cities: TCityDynArray; 
    CitiesCount: integer; 
    City: TCity; 
    added: boolean; 
    N: string; 
    i,j: integer; 
const CITIES_MAX=200000; 
begin 
    // valide generic-like features 
    // see http://docwiki.embarcadero.com/CodeExamples/en/Generics_Collections_TDictionary_(Delphi) 
    ACities.Init(TypeInfo(TCityDynArray),Cities,nil,nil,nil,@CitiesCount); 
    (...) 
    Check(ACities.FindHashed(City)>=0); 
    for i := 1 to 2000 do begin 
    City.Name := IntToStr(i); 
    City.Latitude := i*3.14; 
    City.Longitude := i*6.13; 
    Check(ACities.FindHashedAndUpdate(City,true)=i+2,'multiple ReHash'); 
    Check(ACities.FindHashed(City)=i+2); 
    end; 
    ACities.Capacity := CITIES_MAX+3; // make it as fast as possible 
    for i := 2001 to CITIES_MAX do begin 
    City.Name := IntToStr(i); 
    City.Latitude := i*3.14; 
    City.Longitude := i*6.13; 
    Check(ACities.FindHashedAndUpdate(City,true)=i+2,'use Capacity: no ReHash'); 
    Check(ACities.FindHashed(City.Name)=i+2); 
    end; 
    for i := 1 to CITIES_MAX do begin 
    N := IntToStr(i); 
    j := ACities.FindHashed(N); 
    Check(j=i+2,'hashing with string not City.Name'); 
    Check(Cities[j].Name=N); 
    CheckSame(Cities[j].Latitude,i*3.14); 
    CheckSame(Cities[j].Longitude,i*6.13); 
    end; 
end; 

Así que para su problema:

type 
    TMyMap = record 
    Key: string; 
    Value: array of string; 
    end; 
    TMyMapDynArray = array of TMyMap; 

var 
    Map: TMyMap; 
    Maps: TMyMapDynArray; 
    MapW: TDynArrayHashed; 
    key: string; 
    i: integer; 
begin 
    MapW.Init(TypeInfo(TMyMapDynArray),Maps); 
    Map.Key := 'Some key'; 
    SetLength(Map.Value,2); 
    Map.Value[0] := 'One'; 
    Map.Value[1] := 'Two'; 
    MapW.FindHashedAndUpdate(Map,true); // ,true for adding the Map content 
    key := 'Some key'; 
    i := MapW.FindHashed(key); 
    // now i=0 and Maps[i].Key=key 
    for i := 0 to MapW.Count-1 do // or for i := 0 to high(Maps) do 
    with Maps[i] do 
    // now you're enumerating all key/value pairs 
end; 
+0

Acabo de utilizar este envoltorio para mi lector de archivos .map, y funciona como un amuleto. Muy rápido y fácil de usar. El archivo .map se lee en un instante, y los nombres de símbolos se agregan a una lista interna usando hash rápido. Ver [este enlace] (http://synopse.info/forum/viewtopic.php?pid=1775#p1775) –

3

Desde Delphi 6, el conjunto de clases de contenedores predefinidos incluye TBucketList y TObjectBucketList. Estas dos listas son asociativas, lo que significa que tienen una clave y una entrada real. La clave se usa para identificar los artículos y buscarlos. Para agregar un elemento, llame al método Agregar con dos parámetros: la clave y los datos. Cuando utiliza el método Find, pasa la clave y recupera los datos. El mismo efecto se logra utilizando la propiedad del conjunto de datos, pasando la clave como parámetro.