Ruby/RoR - 计算数组中元素的出现次数

Mit*_*ran 17 ruby arrays ruby-on-rails

我是哈希

{1=>true, 7=>false, 6=>true, 4=>false}

或类似的数组

[1, true], [7, false], [6, true], [4, false]]

要么

[true, false, true, false].

如何true在阵列中找到s 的数量?

Jör*_*tag 24

为了计算元素,你显然必须迭代集合.迭代Hash生成两元素Arrays,前两个实际上完全相同:

{ 1 => true, 7 => false, 6 => true, 4 => false }.count(&:last)
[[1, true], [7, false], [6, true], [4, false]].count(&:last)
Run Code Online (Sandbox Code Playgroud)

对于简单的Array情况,你可以这样做:

[true, false, true, false].count(true)
Run Code Online (Sandbox Code Playgroud)

Array当然也是一样的Hash#values从你的Hash上面,这样你就可以用同样的方法上:

{ 1 => true, 7 => false, 6 => true, 4 => false }.values.count(true)
Run Code Online (Sandbox Code Playgroud)

如果你不知道你会得到哪三个,你可以使用这样的东西:

{ 1 => true, 7 => false, 6 => true, 4 => false }.flatten.count(true)
[[1, true], [7, false], [6, true], [4, false]].flatten.count(true)
[true, false, true, false].flatten.count(true)
Run Code Online (Sandbox Code Playgroud)


tok*_*and 6

使用可枚举#count:

hash.values.count(true)
array_of_pairs.map { |k, v| v }.count(true)
plain_array.count(true)
Run Code Online (Sandbox Code Playgroud)

更详细,但不创建中间数组:

hash_or_array_of_pairs.inject(0) { |acc, (k, v)| acc + (v == true ? 1 : 0) }
Run Code Online (Sandbox Code Playgroud)