Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在按一维排序的数组上循环?_Sorting_Chapel - Fatal编程技术网

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

似乎在中也讨论了这一点