假设我们的宠儿A
看起来像
60.0 3.0
675.0 3.0
1050.0 4.0
0.0 0.0
我想按第一列的降序循环遍历行。有点像...
for r in sorted(A, by=A[1,], reverse=True) {
writeln(r);
}
我想要
1050.0 4.0
675.0 3.0
60.0 3.0
0.0 0.0
Sort文档未涉及2D数组。
答案 0 :(得分:1)
如您所见,Sort模块目前仅支持1D阵列。
作为解决此问题的方法,您可以编写一个sort()
包装器,将数据重组为一个数组数组并对其进行排序,如果您愿意接受性能上的惩罚,那么由于创建一个临时数组并迭代两次。
这方面的一个例子:
use Sort;
var A: [1..4, 1..2] real = ((60.0, 3.0), (675.0, 3.0), (1050.0, 4.0), (0.0, 0.0));
writeln('A:');
writeln(A);
sort2D(A, axis=2, reversed=true);
writeln('A sorted:');
writeln(A);
/* 2D sort wrapper using temp array */
proc sort2D(A: [?D] ?t, axis=1, reversed=false) {
const (rows, cols) = A.shape;
// array of arrays
var tmp: [D.dim(1)] [D.dim(2)] t;
for row in D.dim(1) {
tmp[row] = A[row, ..];
}
var cmp = new Comparator2D(axis, reversed);
sort(tmp, comparator=cmp);
for row in D.dim(1) {
A[row, ..] = tmp[row];
}
}
/* Comparator for arrays of arrays */
record Comparator2D {
const axis = 1,
reversed = false;
proc key(a) {
if reversed then
return -a[axis];
else
return a[axis];
}
}