2017-10-31 1 views
0

Ich möchte zählen, wie viel D und E und F enthält das Array ary insgesamt.Wie man mehr Schönheit Rubin Code zu zählen mehrere Elemente in flatten Array

Ich kann es tun wie

ary.count('D') + ary.count('E') + ary.count('F') 

oder

wie
count = 0 
'DEF'.split('').each do |letter| 
    count += ary.count(letter) 
end 
count 

aber beide davon sehen nicht sehr klug für mich ist es eine bessere Art und Weise in Ruby? Leider funktioniert .count('D','E','F') nicht.

+0

Ist 'ary' ein Array von 1-Zeichenketten? Wenn nicht, und ein Element von "ary" ist "DDr", zählt das als "0", "1" oder "2" "D'"? –

+0

@CarySwoveland: Nun, wenn Beispiele Beispiele sind, dann ist es ein Array von Ein-Zeichen-Strings. –

+0

Bereit, eine Antwort auszuwählen? –

Antwort

1

Sie können einen Block-Array#count passieren, wie folgt:

ary.count { |item| %w(D E F).include?(item) } 

Dies wird eine Zählung, wie viele Elemente, für die Rückkehr der Block einen truthy zurückgibt (nicht nil oder false) Wert.

%w() ist eine nette Syntax für eine Reihe von Strings definieren - das heißt, die sind äquivalent:

['D', 'E', 'F'] == %w(D E F) 
+1

Vielleicht nur '' DEF'.include? (Item) '. –

+0

Vielleicht, aber dies wird auch "DE", "EF" und "DEF" übereinstimmen. Wenn ein strenger Ein-Buchstaben-Vergleich benötigt wird, reicht dies nicht aus –

+0

Wir brauchen eine Klarstellung. Ich habe einen Kommentar zu der Frage hinterlassen. –

3

Sie einen regulären Ausdruck verwenden könnte.

ary.grep(/\A(D|E|F)\z/).size 

Sie können diese regex von Array bauen ['D', 'E', 'F'], aber ich werde das für Sie überlassen.

+0

Warum die Anker? Ich muss etwas Offensichtliches vermissen. –

+0

@CarySwoveland Zum Einpassen von Strings mit einem Buchstaben und nicht von Strings wie '' F grade''. –

+0

Siehe meinen Kommentar zu der Frage. –

3

Es ist ziemlich einfach, wenn Sie einfach nur Buchstaben zählen:

letters = 'AEIOU'.chars 

matches = 'FISSION'.chars.grep(Regexp.union(letters)).count 

Wo dies zur Anpassung einzelne Buchstaben-Instanzen in einem Groß- und Kleinschreibung nützlich ist. Hier erstellt Regexp.union einen einzelnen regulären Ausdruck, der mit einem dieser Buchstaben übereinstimmt.

+1

das sieht für mich nicht einfacher aus – Asara

+1

Ein kleiner Vorschlag: ''FISSION.each_char.grep ...'. –

+0

@CarySwoveland Warum 'each_char' vs.' chars'? – tadman

0

Sie waren in der Nähe. Es ist eigentlich sehr einfach, ein wenig bekanntes Merkmal von String#count mit:

'DEF'.count('DEF') #=> 3 
'FEED ME'.count('DEF') #=> 5