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.
Share:
10,923
Max Smith
Author by

Max Smith

Updated on July 24, 2022

Comments

  • Max Smith
    Max Smith almost 2 years

    How can I sort TDictionary by a key of Integer in ascending order in Delphi 2009?

    • Ron Maupin
      Ron Maupin almost 9 years
      TDictionaries are sorted by hash. You need to read it into some sort of list that can be sorted.
  • David Heffernan
    David Heffernan about 4 years
    The spring4d dictionary is ordered
  • J...
    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
    David Heffernan about 3 years
    Nope. 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...
    J... about 3 years
    @DavidHeffernan Interesting. I think I'll try to find an article.