Sorting TDictionary by a key of Integer in ascending order
10,923
The RTL TDictionaries are not sorted and cannot be sorted (other than by hash, which they are). You need to use another container if you wish to sort either the keys or the values. For example :
program Project1;
{$APPTYPE CONSOLE}
uses
Generics.Collections, Generics.Defaults, SysUtils;
var
LDict : TDictionary<integer, string>;
i, j : integer;
LArray : TArray<integer>;
begin
LDict := TDictionary<integer, string>.Create;
try
// Generate some values
Randomize;
for i := 0 to 20 do begin
j := Random(1000);
LDict.AddOrSetValue(j, Format('The Value : %d', [j]));
end;
WriteLn('Disorder...');
for i in LDict.Keys do
WriteLn(LDict.Items[i]);
// Sort
LArray := LDict.Keys.ToArray;
TArray.Sort<integer>(LArray);
WriteLn('Order...');
for i in LArray do
WriteLn(LDict.Items[i]);
finally
LDict.Free;
end;
Readln;
end.
Author by
Max Smith
Updated on July 24, 2022Comments
-
Max Smith almost 2 years
How can I sort TDictionary by a key of Integer in ascending order in Delphi 2009?
-
Ron Maupin almost 9 yearsTDictionaries are sorted by hash. You need to read it into some sort of list that can be sorted.
-
-
David Heffernan about 4 yearsThe spring4d dictionary is ordered
-
J... about 3 years@DavidHeffernan With O(1) lookup? And without double the storage requirements? Surely something had to be sacrificed for that...
-
David Heffernan about 3 yearsNope. It is code that I donated to spring4d, and worked with Stefan to integrate it and then he has done quite a lot more work optimising it. The algorithm is based on the Python compact dictionary. There are lots of articles about this, but here's a video from its creator: paulvanderlaken.com/2019/12/28/…
-
J... about 3 years@DavidHeffernan Interesting. I think I'll try to find an article.