🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #334911

Re: TDictionary<> i kolejnosc dodawania

#334911
From: R.e.m.e.K
Date: Wed, 25 Jan 2012 11:45
62 lines
3208 bytes
Dnia Tue, 24 Jan 2012 11:48:28 +0100, wloochacz napisał(a):

> W dniu 2012-01-24 11:29, R.e.m.e.K pisze:
>> Witam
>>
>> TDictionary<Key,Value>  tworzy hastabla indeksowanego po Keyu, wiec po
>> zapisaniu kolejno do slownika 10 pozycji sa one ukladane wewnetrznie w innej
>> kolejnosci niz kolejnosc dodawania przez co ich odczyt for-in loopem nie
>> zwraca ich w kolejnoci dodawania. Oczywiscie dzieki temu algorytm
>> wyszukiwania jest bardzo szybki, ale traci sie oryginalna kolejnosc, ktora
>> czasem jest przydatna. Czy jest sposob, aby zmusic TDictionary, by kosztem
>> wydajnosci zachowywalo oryginalny porzadek dodawania elementow?
>> Wiem, ze moge uzyc zamiast TDictionary np. TList<TPair<Key,Value>>  ale
>> jednak TDictionary ma kilka wygodnych metod :-P
> Jakich metod?
A chocby:
AddOrSetValue
TryGetValue
ContainsKey
ContainsValue

Oczywiscie moge je sobie dopisac, tylko tutaj po prostu juz sa.
 
> Nadpisz TDictionary, nadpisz metodę Add (a właściwie DoAdd) żeby dodawać 
> indeks, zaimplementuj enumerator żeby for-in działał jak chcesz.

Nie widze tego jakos, przejrzalem klase TDictionary i raczej imho problem
lezy w jej metodzie GetBucketIndex(). Sam enumerator wyglada tak:

function TDictionary<TKey,TValue>.TPairEnumerator.MoveNext: Boolean;
begin
  while FIndex < Length(FDictionary.FItems) - 1 do
  begin
    Inc(FIndex);
    if FDictionary.FItems[FIndex].HashCode <> 0 then
      Exit(True);
  end;
  Result := False;
end;

Co moglbym w nim zmienic? Wszak on idzie po kolei po tablicy i bierze
wartosc jesli nie jest pusta (skasowana), z kolei podczas dodawania pozycja
jest wstawiana zaleznie od funkcji haszujacej, ktora opiera sie chyba o
algorytm jakiegos rodzaju drzewa, i to jest "problem" bo juz wstawianie moze
(chyba) zaburzac porzadek.
 
> Pamiętaj, że TDictionary posiada trzy enumeratory (TPairEnumerator, 
> TValueEnumerator i TKeyEnumerator) dla trzech kolekcji: para (Key = 
> Value), ale nie musisz ich implmentować jeśli posługujesz się np. tylko 
> enumeratorem TPair<T, T>;

Generalnie chwilowo temat odpuszczam, bo nie jest to tak trywialne jak
myslalem poczatkowo, musze dokladniej przyjrzec sie tym algorytmom, bo to
ciekawe, ale priorytet ma na razie niski, zrobilem sobie na TList<>.

btw fajnie, ze w koncu sa szybkie implementacje list, slownikow etc.

Dzieki za pomoc.

-- 
pozdro
R.e.m.e.K
Technical Details
Message-ID: <1k03j6la3pijr$.dlg@hell.heaven>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mail
References: <1ap3bo51k49nb.dlg@hell.heaven> <jfm2a6$rep$1@inews.gazeta.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mail
From: "R.e.m.e.K" <go@dev.null>
Newsgroups: pl.comp.lang.delphi
Subject: Re: TDictionary<> i kolejnosc dodawania
Date: Wed, 25 Jan 2012 12:45:43 +0100
Organization: ICM, Uniwersytet Warszawski
Lines: 62
Sender: hell@heaven
Message-ID: <1k03j6la3pijr$.dlg@hell.heaven>
References: <1ap3bo51k49nb.dlg@hell.heaven> <jfm2a6$rep$1@inews.gazeta.pl>
NNTP-Posting-Host: 89-75-115-216.dynamic.chello.pl
Mime-Version: 1.0
X-Trace: news.icm.edu.pl 1327491940 24466 89.75.115.216 (25 Jan 2012 11:45:40 GMT)
X-Complaints-To: usenet@news.icm.edu.pl
NNTP-Posting-Date: Wed, 25 Jan 2012 11:45:40 +0000 (UTC)
User-Agent: 40tude_Dialog/2.0.15.1pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit