2011-10-31 20 views
7

Ho bisogno di una raccolta chiave/valore delphi che mi consenta di eseguire iterazioni sulla raccolta nello stesso ordine in cui sono state inserite/aggiunte coppie chiave/valore.Raccolta chiavi/valori che mantiene l'ordine

TList<T> l'ordine di garanzia ma TDictionary<T1, T2> no.

Immagino che potrei sempre definire un TList<TPair<Key, Value>> ma sarebbe più complicato lavorare con.

Esiste un tipo di raccolta incorporato in grado di soddisfare le mie esigenze o di eseguire il wrapping di TList<TPair<Key, Value>> come opzione migliore? O forse sarebbe meglio avere un TList<Key> e un TDictionary<Key, Value> e scorrere l'elenco.

+0

Non esiste un dizionario ordinato incorporato. Mi aspetto che ci siano implementazioni di terze parti in giro, ma personalmente non ne conosco una. –

+0

Un 'TList >' ordinato sulla chiave non è un problema, perché un'operazione di ricerca chiave potrebbe utilizzare una ricerca binaria, ma una struttura di dati basata su 'albero 'è probabilmente ciò di cui hai bisogno. Notare che 'TList >' non impone l'univocità, che è qualcosa che si potrebbe voler implementare anche se si vogliono applicare chiavi univoche. –

risposta

3

Se il tipo di chiave è string e il tipo di valore è un discendente di TObject, utilizzare TStringList. Memorizza i tuoi valori nella proprietà dell'array Objects.

SL.AddObject('foo', obj1); 

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

Impostare la proprietà OwnsObjects se è necessario.

3

il DeHL collections library contiene un sacco di classi simili a "Ordinato dizionario". Gli ordinati usano alberi (che hanno ordine) invece di mappe hash che non sono ordinate.

Credo che il TSortedDistinctMultiMap potrebbe essere quello che ti serve, se si vuole rispettare l'unicità, e se non si desidera applicare Key valore di unicità, poi ci sono altre scelte (senza Distinct nel nome della classe) che sarà vicino a quello che ti serve.

Problemi correlati