2012-04-08 41 views
3
float[float] aa = [2.2:7.7, 3.3:6.6, 1.1:4.4]; 
std.sort(aa); 
assert(aa == [1.1:4.4, 2.2:7.7, 3.3:6.6]); 

上述不起作用。如何排序aa如何对联合数组进行排序?

+0

您是否需要给定顺序的rsults,或者您是否需要检查两个不同的AA实例是否相同? – BCS 2012-04-08 16:09:37

+0

@我需要给定顺序的结果,就像'std :: map'一样。我可能最终会使用'std.container'。 – Arlen 2012-04-08 17:14:25

回答

7

D的内置关联数组是hash tables。它们是未分类的,对它们进行分类是没有意义的。只有在遍历AA时,排序才会有意义,并且需要将它们放入新的容器中。所以,你可以做类似

auto keys = aa.keys; 
sort(keys); 

但你不能排序AA本身。如果你想要一个有排序的地图,那么你需要使用像std.container.RedBlackTree这样的东西 - 尽管它需要一点工作来使它起到一个映射而不是一个集合的作用(例如,排序函数只能在键上排序,将东西传递给一些函数,你需要一个带有虚拟值的元组)。

这就是为什么Java有HashMapSortedMap以及为什么C++有unordered_map(C++ 11)和map。它们都是地图,它们都具有非常不同的特征 - 特别是在排序和查找时间方面。

6

你不能 - 它没有意义。

关联数组也被称为“词典”或“地图”; D中的特定变体是散列表。他们是而不是阵列。排序他们将打破他们的能力给你一个快速的查找时间。

如果您需要快速查找时间,请考虑使用RedBlackTree代替。

+0

'std :: map'被排序,而'std :: unordered_map'不是。也许他们应该把它称为“哈希”,而不是关联数组。 – Arlen 2012-04-08 06:12:50

+0

@Arlen:你之前做过PHP吗? – Mehrdad 2012-04-08 06:42:55

+0

@Arlen关联数组是一个完美有效的术语。就个人而言,我会称它为散列表,但将其称为关联数组是完全正确的:http://en.wikipedia.org/wiki/Associative_array – 2012-04-08 07:30:09