Delphi中TDictionary的奇怪行为

5

我有以下问题:

我正在将一些值填充到字典中,并希望以与我填充它们相同的顺序获取它们。

但不知何故,当我遍历这些项时,它们按非逻辑顺序(IMDO)排序。

运行以下程序后:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Generics.Collections;
var
  Dictionary: TDictionary<LongWord, string>;
  aPair: TPair<LongWord, string>;
begin
  Dictionary := TDictionary<LongWord, string>.Create;
  Dictionary.add(1, 'First Item');
  Dictionary.add(2, 'Second Item');
  Dictionary.add(3, 'Third Item');
  Dictionary.add(4, 'Forth Item');
  Dictionary.add(5, 'Fifth Item');
  Dictionary.add($FFFFFFFF, 'Longword Item');

  for aPair in Dictionary do
    writeln(aPair.Value);

  readln;
end.

我得到了以下结果:
Forth Item
Longword Item
First Item
Third Item
Second Item
Fifth Item

我做错了什么吗?

在XE5和Rad Studio Berlin上进行测试,结果相同。

感谢您的帮助。

1个回答

6

Delphi字典类是无序的。它的行为是按设计来的。如果您希望保留顺序,则需要使用有序数据结构,例如数组或列表。

如果您希望具有有序访问和O(1)查找,则需要同时维护两个集合。一个是用于有序访问的数组或列表,另一个是用于O(1)查找的字典。或者,您可以寻找提供有序字典实现的库。


谢谢 David,感激不尽! - Marco Carboni
有点棘手,但这正是我在你第一次回复我的时候考虑管理它的方式。它为什么设计成那样? - Marco Carboni
在这种情况下,O(1)查找的实现基于哈希和桶。这并不自然地适用于维护顺序。由于该集合旨在通过无序键进行随机访问,为什么要实现更多功能以支持有序键的随机访问呢? - David Heffernan

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