如何循环在Chapel中按一维排序的数组?

时间:2017-09-12 19:43:39

标签: 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文档未涉及2D数组。

1 个答案:

答案 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];
  }
}