计算bool数组中真实元素的数量

时间:2017-05-11 22:42:44

标签: arrays chapel

在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()

1 个答案:

答案 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 ) );

*)=也许其中一件事应该改变......