在D中排序关联数组

时间:2015-04-06 22:04:00

标签: algorithm sorting d associative-array

这可能不是最好的主意,但我试图使用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&lt; b”,SwapStrategy ss = SwapStrategy.unstable,Range )(范围r)if((ss == SwapStrategy.unstable&amp;&amp;(hasSwappableElements!Range || hasAssignableElements!Range)|| ss!= SwapStrategy.unstable&amp;&amp; hasAssignableElements!Range)&amp;&amp; isRandomAccessRange! Range&amp;&amp; hasSlicing!Range&amp;&amp; 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 个答案:

答案 0 :(得分: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来说并不是特别有效。

答案 1 :(得分:3)

关联数组无法排序 - 它们有自己固有的结构,不允许移动物体。这是哈希表课程的标准。

要对任何内容进行排序,首先必须将其置于随机访问结构中,最有可能是数组。

相关问题