2

假设我们的宝贝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

排序文档不涉及二维数组。

4

1 回答 1

1

如您所见,Sort 模块目前仅支持一维数组。

作为解决此问题的方法,您可以编写一个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];
  }
}
于 2017-09-12T22:01:01.127 回答