2010-12-20 12 views

Antwort

21

Um die Elemente zu zählen, müssen Sie offensichtlich über die Sammlung iterieren. Seit mehr als einem Iterieren Hash ergibt zwei Elementen Array s, die ersten beiden sind eigentlich genau das gleiche:

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

Für den einfachen Array Fall Sie so etwas tun könnte:

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

Diese Array ist natürlich auch das gleiche wie die Hash#values von Ihrem Hash oben, so dass Sie die gleiche Methode dafür verwenden könnten:

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

Wenn Sie nicht wissen, welche eine von drei Sie erhalten, könnten Sie so etwas wie folgt verwenden:

{ 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

Fantastische Lösungen, danke für alle, die die Antwort suchen :) – sidney

+0

Easy one! Vielen Dank – Vlad

1

Für Hashes:

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

Für Arrays:

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

Eine weitere Möglichkeit (Prüfung mit einer Negation):

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

Eine Möglichkeit (Ihr Hash würde .to_a genannt müssen auf es zuerst für das daran zu arbeiten):

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

Mit Enumerable#count:

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

Wortreicher, stellt jedoch keine Zwischen Arrays:

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

Einfachere:

hash.values.count(true) 

array.flatten.count(true) 

Dies funktioniert mit allen oben genannten Fällen.

+0

ja, aber im Fall des Arrays mit Paaren, array.flatten.count (true) ist konzeptionell komisch, da dabei auch die Schlüssel (erstes Paar) berücksichtigt werden. Ich weiß, dass ein Wahres dort nie gefunden werden sollte, aber trotzdem ... – tokland

+0

Nun, wenn man sich Gedanken über die Schlüssel macht, die möglicherweise ein Wahres enthalten, so unwahrscheinlich wie es ist, könnte man das tun: 'Hash [array] .values.zählen (wahr) ' –

Verwandte Themen