2011-10-31 4 views
7

J'ai besoin d'une collection clé/valeur delphi qui me permettra d'itérer sur la collection dans le même ordre que les paires clé/valeur ont été insérées/ajoutées.Collection clé/valeur qui maintient la commande

TList<T> garantit la commande mais pas TDictionary<T1, T2>.

Je suppose que je pourrais toujours définir un TList<TPair<Key, Value>> mais il serait plus encombrant de travailler avec.

Existe-t-il un type de collection intégré qui répondrait à mes exigences ou l'emballage TList<TPair<Key, Value>> serait-il ma meilleure option? Ou peut-être qu'il serait préférable d'avoir un TList<Key> et un TDictionary<Key, Value> et parcourir la liste.

+0

Il n'y a pas de dictionnaire ordonné intégré. Je m'attends à ce qu'il y ait des implémentations de tiers, mais personnellement, je n'en connais pas. –

+0

A 'TList >' trié sur Key n'est pas trop mauvais, car une opération de recherche de clé pourrait utiliser une recherche binaire, mais une structure de données basée sur l'arbre est probablement ce dont vous avez besoin. Notez que 'TList >' n'appliquera pas l'unicité, ce que vous pourriez vouloir implémenter si vous voulez appliquer des clés uniques. –

Répondre

3

Si votre type de clé est string et que votre type de valeur est un descendant de TObject, utilisez un TStringList. Stockez vos valeurs dans la propriété de tableau Objects.

SL.AddObject('foo', obj1); 

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

Définissez la propriété OwnsObjects si vous avez besoin.

3

le DeHL collections library contient beaucoup de classes "similaires au dictionnaire ordonné". Les ordonnés utilisent des arbres (qui ont de l'ordre) au lieu de cartes de hachage qui ne sont pas ordonnées.

je crois que le TSortedDistinctMultiMap peut-être ce dont vous avez besoin, si vous voulez assurer l'unicité, et si vous ne voulez pas respecter l'unicité de la valeur Key, alors il y a d'autres choix (sans Distinct au nom de la classe) qui sera proche de ce dont vous avez besoin.

Questions connexes