Sorting 如何在按一维排序的数组上循环?
假设我们亲爱的Sorting 如何在按一维排序的数组上循环?,sorting,chapel,Sorting,Chapel,假设我们亲爱的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()
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()
包装器,将您的数据重新构造为一个数组数组并进行排序,如果您愿意接受由于创建临时数组并对其进行两次迭代而造成的性能损失的话
例如:
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];
}
}
似乎在中也讨论了这一点