2010-12-20 2 views
14

I'vにハッシュルビー/ RoRの - アレイ

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

又は

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

又は

[true, false, true, false]様配列を要素の発生をカウント。

配列内のtrueの番号はどのようにして見つけることができますか?ハッシュについては

答えて

21

要素を数えるには、明らかにコレクションを反復処理する必要があります。 Hashを反復処理すると、2つの要素Array Sを生成するので、最初の二つは正確に実際には同じです:

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

このArray:シンプルArrayケースでは

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

、あなたはこのような何かを行うことができます上記のHashHash#valuesと同じですから、同じ方法を使用することもできます。

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

あなたはこのようなものを使用でき、あなたが得るであろう3の1わからない場合:

{ 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

+0

簡単な1つ!ありがとうございました – Vlad

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をコールする必要があります最初にそれを処理するため):

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

より詳細な
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

+0

真実を含んでいる可能性のあるキーについて心配していたのであれば、これを行うことができます: 'Hash [array] .values。カウント(真) ' –