2011-10-31 15 views
7

Potrzebuję kolekcji klucz/wartość delphi, która pozwoli mi na iterację nad kolekcją w tej samej kolejności, w której pary/pary zostały wstawione/dodane.Zbiór kluczy/wartości, który zachowuje porządek

TList<T> gwarantuje zamówienie, ale TDictionary<T1, T2> nie.

Domyślam się, że zawsze mogę zdefiniować TList<TPair<Key, Value>>, ale byłoby to bardziej kłopotliwe w pracy.

Czy istnieje opcja mojego wbudowanego typu, który spełniłby moje wymagania, lub czy opakowanie jednostkowe to TList<TPair<Key, Value>>? A może lepiej byłoby mieć TList<Key> i TDictionary<Key, Value> i iterować po liście.

+0

Brak wbudowanego słownika uporządkowanego. Spodziewam się, że istnieją implementacje stron trzecich, ale ja osobiście o tym nie wiem. –

+0

'TList >' posortowane na kluczu nie jest takie złe, ponieważ operacja wyszukiwania klucza może korzystać z wyszukiwania binarnego, ale prawdopodobnie potrzebna jest struktura danych typu "drzewo". Zauważ, że 'TList >' nie będzie wymuszać unikalności, która jest czymś, co możesz również chcieć zaimplementować, jeśli chcesz wymusić unikalne klucze. –

Odpowiedz

3

Jeśli typem klucza jest string, a typem wartości jest potomek TObject, należy użyć TStringList. Przechowuj swoje wartości we właściwości tablicy Objects.

SL.AddObject('foo', obj1); 

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

Ustaw właściwość OwnsObjects, jeśli potrzebujesz.

3

the DeHL collections library zawiera wiele klas podobnych do "uporządkowanych słowników". Te uporządkowane używają drzew (które mają porządek) zamiast map haszy, które są nieuporządkowane.

wierzę TSortedDistinctMultiMap może być to, czego potrzebujesz, jeśli chcesz, aby wymusić unikalność, a jeśli nie chcesz, aby wymusić Key wartość wyjątkowości, to istnieją inne możliwości (bez Distinct w nazwie klasy), które będą blisko tego, czego potrzebujesz.