对 D 中的关联数组进行排序
sorting an associative array in D
这可能不是最好的主意,但我试图使用 D 的一些内置功能对关联数组进行排序。这样我就可以对顶部或底部值进行一部分计算。
我试过:
sort!((a,b) {return query[a] < query[b];})(query);
和:
sort(query);
导致同样的错误:
Error: template std.algorithm.sort cannot deduce function from argument types !()(int[string]), candidates are:
/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)
这里是完整的 class:
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;
}
关联数组无法排序 - 它们有自己固有的结构,不允许四处移动。这是哈希表课程的标准。
要对任何内容进行排序,您必须先将其放入随机访问结构中,很可能是数组。
正如 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 来说不是特别有效。
这可能不是最好的主意,但我试图使用 D 的一些内置功能对关联数组进行排序。这样我就可以对顶部或底部值进行一部分计算。
我试过:
sort!((a,b) {return query[a] < query[b];})(query);
和:
sort(query);
导致同样的错误:
Error: template std.algorithm.sort cannot deduce function from argument types !()(int[string]), candidates are: /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)
这里是完整的 class:
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;
}
关联数组无法排序 - 它们有自己固有的结构,不允许四处移动。这是哈希表课程的标准。
要对任何内容进行排序,您必须先将其放入随机访问结构中,很可能是数组。
正如 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 来说不是特别有效。