2010-12-20 28 views

回答

21

爲了計算元素,顯然必須遍歷集合。由於迭代一個Hash產生兩個元素Array S,前兩個實際上是完全一樣的:

{ 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中的Hash#values相同,因此您可以使用相同的方法:

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

真棒解決方案,謝謝大家正在尋求答案:) – sidney 2014-06-21 17:51:52

+0

簡單的一個!謝謝 – Vlad 2016-04-29 17:48:24

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 
1

的一種方式(你的哈希需要.to_a呼籲它首先要對此進行處理):

[[1, true], [7, false], [6, true], [4, false]].flatten.select{|s| s == true }.size 
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) } 
4

簡單:

hash.values.count(true) 

array.flatten.count(true) 

這適用於所有上述情況。

+0

是的,但與對,array.flatten.count(真)陣列的情況下在概念上很奇怪,因爲它也考慮到了鑰匙(第一對)。我知道真的不應該在那裏找到,但仍然... – tokland 2010-12-20 13:11:48

+0

好吧,如果有人擔心可能包含true的鍵,就像它不可能,你可以這樣做:'Hash [array] .values。count(true)' – 2010-12-20 13:17:35