2017-01-01 13 views
5

Mam następujący problem:Nietypowe zachowanie dziwacza w delphi

Wprowadzam słownik z pewnymi wartościami i chciałbym przywrócić je w tej samej kolejności, w jakiej je wypełniłem.

Jakoś nie działa, kiedy przeglądam elementy, które są sortowane według kolejności nielogicznej (IMDO).

Po Poniższy program jest prowadzony:

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, System.Generics.Collections; 
var 
    Dictionary: TDictionary<LongWord, string>; 
    aPair: TPair<LongWord, string>; 
begin 
    Dictionary := TDictionary<LongWord, string>.Create; 
    Dictionary.add(1, 'First Item'); 
    Dictionary.add(2, 'Second Item'); 
    Dictionary.add(3, 'Third Item'); 
    Dictionary.add(4, 'Forth Item'); 
    Dictionary.add(5, 'Fifth Item'); 
    Dictionary.add($FFFFFFFF, 'Longword Item'); 

    for aPair in Dictionary do 
    writeln(aPair.Value); 

    readln; 
end. 

Mam następujące wyniki:

Forth Item 
Longword Item 
First Item 
Third Item 
Second Item 
Fifth Item 

Czy robię coś źle?

Testowany na XE5 i Rad Studio Berlin, te same wyniki.

Dzięki za pomoc.

Odpowiedz

6

Klasa słownika języka Delphi jest nieuporządkowana. Zachowuje się zgodnie z przeznaczeniem. Jeśli chcesz zachować zamówienie, musisz użyć uporządkowanej struktury danych. Na przykład tablica lub lista.

Jeśli chcesz zamówić dostęp, a także wyszukiwanie O (1), musisz zachować dwie kolekcje w tandemie. Jedna tablica lub lista dla uporządkowanego dostępu, a jednocześnie słownik dla O (1). Lub, alternatywnie, znajdź bibliotekę, która oferuje uporządkowaną implementację słownika.

+0

Dzięki David, doceniamy! –

+0

Trochę podstępne, ale to, co myślałem, aby sobie z tym poradzić, kiedy pierwszy raz mi odpowiedziałeś. Czy istnieje jakiś powód, dla którego został zaprojektowany w ten sposób? –

+0

W tym przypadku implementacja wyszukiwania O (1) jest oparta na haszach i segmentach. I to naturalnie nie służy utrzymaniu porządku. Ponieważ ta kolekcja została zaprojektowana do uzyskiwania dostępu losowego przez nieuporządkowany klucz, dlaczego stosuje więcej funkcji do obsługi dostępu losowego za pomocą zamawianego klucza? –