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

时间:2010-12-20 10:14:11

标签: ruby-on-rails ruby arrays

我是哈希

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

或类似

的数组

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

[true, false, true, false]

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

6 个答案:

答案 0 :(得分:23)

为了计算元素,你显然必须遍历集合。由于迭代Hash会产生两个元素Array,前两个实际上完全相同:

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

对于简单的Array案例,您可以执行以下操作:

[true, false, true, false].count(true)

Array当然也与上面Hash#values中的Hash相同,因此您可以使用相同的方法:

{ 1 => true, 7 => false, 6 => true, 4 => false }.values.count(true)

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

{ 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)

答案 1 :(得分:6)

使用Enumerable#count

hash.values.count(true)
array_of_pairs.map { |k, v| v }.count(true)
plain_array.count(true)

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

hash_or_array_of_pairs.inject(0) { |acc, (k, v)| acc + (v == true ? 1 : 0) }

答案 2 :(得分:4)

简单:

hash.values.count(true)

array.flatten.count(true)

这适用于以上所有情况。

答案 3 :(得分:1)

哈希:

{ :a => true, :b => true, :c => false }.select{ |k,v| v }.length
 => 2

对于数组:

[true, false, false, true, true].select{ |o| o }.length
 => 3

另一种方式(用否定测试):

[true, false, false, true, true].reject{ |o| o != true }.length
 => 3

答案 4 :(得分:1)

一种方法(你的哈希需要首先调用它.to_a才能使用它):

[[1, true], [7, false], [6, true], [4, false]].flatten.select{|s| s == true }.size

答案 5 :(得分:0)

Ruby 2.7 +

Ruby 2.7为此引入了Enumerable#tally(可能还有tally_by)。 here有一个很好的摘要。

这里讨论了在提供块时最终实现是使用tally还是tally_by的问题,

在这种情况下:

# or hash.tally_by if that's the accepted method for block form
hash.tally { |k, v| v }
# => { true => 2, false => 2 }

有关已发布功能的文档为here

希望这对某人有帮助!