按升序排列整数键的TDictionary

9
在Delphi 2009中,如何按升序对TDictionary中的整数键进行排序?

TDictionaries是由哈希排序的。您需要将其读入某种可以排序的列表中。 - Ron Maupin
1个回答

17

RTL TDictionaries没有排序,也不能排序(除非按哈希排序,它们可以)。如果您想要按键或值进行排序,则需要使用另一个容器。例如:

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.

2
spring4d 字典是有序的。 - David Heffernan
@DavidHeffernan 有O(1)的查找速度?而且不需要双倍的存储要求?肯定有什么东西被牺牲了... - J...
1
不是的。这是我捐赠给spring4d的代码,并与Stefan合作进行集成,然后他做了很多优化工作。该算法基于Python紧凑字典。有很多关于此的文章,但以下是其创作者的视频链接:https://paulvanderlaken.com/2019/12/28/history-modern-python-dictionary-raymond-hettinger/ - David Heffernan
@DavidHeffernan 很有趣。我想我会尝试找一篇文章。 - J...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接