2011-10-31 10 views
7

Necesito una colección de clave/valor delphi que me permita iterar sobre la colección en el mismo orden en que se insertaron/agregaron los pares clave/valor.Colección clave/valor que mantiene el orden

TList<T> garantiza el orden pero TDictionary<T1, T2> no lo hace.

Supongo que siempre podría definir un TList<TPair<Key, Value>>, pero sería más complicado trabajar con él.

¿Hay un tipo de colección integrado que cumpla con mis requisitos o que mi TList<TPair<Key, Value>> sea mi mejor opción? O tal vez sería mejor tener un TList<Key> y un TDictionary<Key, Value> e iterar a través de la lista.

+0

No hay un diccionario ordenado incorporado. Espero que haya implementaciones de terceros, pero personalmente no conozco ninguna. –

+0

A 'TList >' ordenado La clave no es tan mala, porque una operación de búsqueda de clave podría usar una búsqueda binaria, pero una estructura de datos basada en 'árbol' es probablemente lo que necesita. Tenga en cuenta que 'TList >' no hará cumplir la unicidad, que es algo que también podría querer implementar si desea aplicar claves únicas. –

Respuesta

3

Si su tipo de clave es string y su tipo de valor es un descendiente de TObject, utilice un TStringList. Almacene sus valores en la propiedad de matriz Objects.

SL.AddObject('foo', obj1); 

SL.Add('bar'); 
i := SL.IndexOf('bar'); 
SL.Objects[i] := obj2; 

establecer la propiedad OwnsObjects si es necesario.

3

DeHL collections library contiene muchas clases similares al "Diccionario ordenado". Los ordenados usan árboles (que tienen orden) en lugar de mapas hash que están desordenados.

creo que el TSortedDistinctMultiMap podría ser lo que necesita, si quiere imponer la exclusividad, y si no desea aplicar Key valor de singularidad, entonces hay otras opciones (sin Distinct en el nombre de la clase) que será cerca de lo que necesitas

Cuestiones relacionadas