在D中访问哈希表作为值排序范围

时间:2013-11-19 21:09:18

标签: sorting range hashtable d

如果我有一个哈希表File[string] _subs并希望以排序方式访问其值,那么有一种更好的方法而不是简单地通过

auto ssubs = new File[_subs.length]; // preallocate sorted subs
size_t ix = 0;
foreach (sub; _subs) {
    ssubs[ix++] = sub;  // set new reference to sub
}

ssubs.sort!((a, b) => (a.timeLastModified >
                       b.timeLastModified));
return ssubs;

2 个答案:

答案 0 :(得分:3)

我建议跳过foreach循环并使用.values,如下所示:

auto ssubs = _subs.values.sort!((a, b) => (a.timeLastModified > b.timeLastModified));

我认为最好不要在元素之间添加依赖关系(比如使用for循环),当他们不需要它时。这样做的原因是没有它就可以更容易地使代码并行。

答案 1 :(得分:3)

如果您发现自己经常进行此操作,请考虑从std.container尝试RedBlackTree。这是通常的排序与运行时复杂度之间的权衡:虽然访问和插入无序散列图(散列集)中的元素(如AA)是O(1),但像RedBlackTree这样的有序映射(集合)上的相同操作是O(log(n) ))。