我正在查看Chapel中的Sort运算符并尝试订购两个数组。
const a = [2.2, 3.3, 1.1, 4.4];
const b = [7, 10, 23, 1];
现在我想要一个迭代器或新数组,它按b
的降序生成a
。那是
var output = [1, 10, 7, 23];
如何使用比较器(或实际上,任何方法)来执行此操作?
答案 0 :(得分:2)
您可以通过将数组压缩在一起并使用comparator对其进行排序来实现此目的,该reverseComparator
定义要排序的数组(压缩表达式的元组索引)和顺序(升序或降序)。有几种不同的方法可以实现这一点,其中一种方法如下所示:
use Sort;
/* Reverse comparator sorting by first element of tuple */
record Cmp {
proc key(a) return a[1];
}
// Create a comparator instance with reversed order
var cmp: ReverseComparator(Cmp);
/* Iterate over elements of array2 reverse-sorted by values of array1 */
iter zipSort(array1, array2) {
// Concatenate the arrays into an array of tuples
const AB = [ab in zip(array1, array2)] ab;
// Sort array with comparator created above
for ab in AB.sorted(comparator=cmp) {
yield ab[2];
}
}
proc main() {
const A = [2.2, 3.3, 1.1, 4.4];
const B = [7, 10, 23, 1];
// Iterator
for b in zipSort(A, B) {
writeln(b);
}
// New array
var output = zipSort(A, B);
writeln(output);
}
我们可以根据您的具体情况简化这一点。由于元组默认按第一个元素排序,我们实际上并不需要创建比较器,但仍需要使用Sort
模块中提供的来颠倒顺序:
use Sort;
/* Iterate over elements of array2 reverse-sorted by values of array1 */
iter zipSort(array1, array2) {
// Concatenate the arrays into an array of tuples
const AB = [ab in zip(array1, array2)] ab;
// Sort array with comparator created above
for ab in AB.sorted(comparator=reverseComparator) {
yield ab[2];
}
}