Article View: pl.comp.lang.delphi
Article #334911Re: TDictionary<> i kolejnosc dodawania
From: R.e.m.e.K
Date: Wed, 25 Jan 2012 11:45
Date: Wed, 25 Jan 2012 11:45
62 lines
3208 bytes
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-mailReferences:
<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