在Chapel中将另一个数组作为索引排序

问题描述 投票:2回答:1

我正在查看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];

我如何使用比较器(或实际上,任何方法)来做到这一点?

arrays chapel
1个回答
2
投票

您可以通过将数组压缩在一起并使用comparator对其进行排序来完成此操作,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); } 定义要排序的数组(压缩表达式的元组索引)和顺序(升序或降序)。有几种不同的方法可以实现这一点,其中一种方法如下所示:

reverseComparator

我们可以根据您的具体情况简化这一点。由于元组默认按第一个元素排序,我们实际上并不需要创建比较器,但仍需要使用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]; } } 来反转顺序:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.