在D语言中对关联数组进行排序

3
这可能不是最好的想法,但我试图使用D语言的一些内置功能来对关联数组进行排序,以便可以对计算进行前几个或后几个值的切片。
我已经尝试过:
sort!((a,b) {return query[a] < query[b];})(query);

并且:

sort(query);

导致相同的错误:

错误:模板std.algorithm.sort无法从参数类型!()(int[string])推断函数,候选项为: /usr/local/Cellar/dmd/2.066.1/include/d2/std/algorithm.d(9384): std.algorithm.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)

这里是整个类:

import std.stdio;
import std.array;
import std.algorithm;

import DataRow;
import LocationMap;

class Database{

this(){ /* intentionally left blank */}

public:
    void addRow(DataRow input){ this.db ~= input; }
    DataRow[] getDB(){ return this.db; }
    DataRow getDBRow(uint i){ return this.db[i]; }

    int[string] exportQuery(uint year){

        int[string] query;
        foreach (DataRow row ; db){
            if (row.getYear() == year){
                query[row.getCountryName()] = row.getExports;
            }
        }
        //sort!((a,b) {return query[a] < query[b];})(query);
        sort(query);
        return query;
    }

private:
    DataRow[] db;
    LocationMap locMap;
}
2个回答

5

正如Andrei所说,你不能直接对关联数组进行排序。

然而,你可以对其键(或值)进行排序,并以排序的方式访问数组。

int[string] myAA = ["c" : 3, "b" : 2, "a" : 1];
foreach(key; myAA.keys.sort){ // myAA.values will access the values in the AA
    writefln("(Key, Value) = (%s, %s)", key, myAA[key]);
}

会打印输出

(Key, Value) = (a, 1)
(Key, Value) = (b, 2)
(Key, Value) = (c, 3)

这在一个大型AA上可能不是特别高效的解决方案。

3

关联数组无法排序 - 它们具有自己的固有结构,不允许移动元素。这对于哈希表来说是很正常的。

要排序任何东西,您必须首先将其放入随机访问结构中,最可能是数组。


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