在Chapel中,我可以将等于给定值的数组元素数量计为
var a = [1,2,5,5,5];
writeln( a.count( 5 ) ); // this gives 3
但是类似的方法似乎不能用于计算真实元素的数量:
writeln( count( a > 1 ) );
writeln( ( a > 1 ).count( true ) );
在这种情况下,我是否需要编写一个显式的for循环,或者是否有任何其他函数(或方法)用于此目的...?
经过一些实验后,似乎将a == 5
的结果保存到新数组
var mask = ( a == 5 );
然后按预期工作
writeln( mask.count( true ) ); // gives 3
那么,a == 5
可能表示与数组对象不同的内容,因此不直接提供.count()
?
答案 0 :(得分:3)
您遇到的问题是 .count()
方法是在数组上定义的,因此在a
上调用它很好。但是,表达式a > 1
不是一个数组,它是一个迭代器表达式,而迭代器表达式不是(当前)支持.count()
方法,也不是强制它们数组(见*)
所以问题与计算布尔值没有任何关系
如果您在数组上计算其他提升的表达式,则会遇到类似的问题:
var a = [ 1, 2, 5, 5, 5],
b = [ 2, 4, 6, 8, 10];
writeln( ( a + b ).count( 6 ) );
解决这个问题的两种令人不满意的方法是
(1)将迭代器表达式转换为数组或
(2)将迭代器表达式存储到数组变量中
但在Chapel中编写此表达式的更典型方法是使用缩减:
writeln( + reduce ( a > 1 ) );
*)=也许其中一件事应该改变......