2017-10-31 4 views
0

DEF에 배열 ary이 얼마나 포함되는지 계산하고 싶습니다.평평한 배열에서 여러 항목을 계산하는 뷰티 루비 코드를 만드는 방법

나는

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

또는

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

하지만 모두가 나에게 매우 스마트 보이지 않는

처럼, 루비에 더 나은 방법이처럼 할 수 있습니까? 죄송합니다. .count('D','E','F')이 작동하지 않습니다. 다음과 같이

+0

인가를'ary' 1 - 문자열의 배열? 그렇지 않다면'ary'의 한 요소는''DDr ''입니다.'0','1' 또는'2'''D''s로 계산합니까? –

+0

@CarySwoveland : 제공되는 예제가 표시되면 하나의 char 문자열 배열입니다. –

+0

답변을 선택하실 준비가 되셨습니까? –

답변

1

당신은, Array#count블록을 전달할 수 있습니다

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

는 블록이 truthy (안 nil 또는 false) 값을 반환하는 얼마나 많은 요소의 수를 반환합니다.

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

아마도 'DEF'.include? (item)'일뿐입니다. –

+0

어쩌면하지만 "DE", "EF"및 "DEF"와도 일치합니다. 엄격한 단일 문자 일치가 필요한 경우, 이것은 충분하지 않습니다 –

+0

우리는 명확한 설명이 필요합니다. 질문에 대한 의견을 남겼습니다. –

3

당신은 정규식을 사용할 수 동등한 다음 즉있다 -

%w()문자열의 배열을 정의하는 좋은 구문입니다.

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

쉽게 배열 ['D', 'E', 'F']에서이 정규식을 구축 할 수 있습니다,하지만 난 당신이를 떠날거야. 당신은 단순히 문자를 계산하는 경우

+0

왜 앵커인가? 나는 명백한 것을 놓치고 있어야합니다. –

+0

@CarySwoveland 'F 등급'과 같은 문자열이 아닌 단일 문자 문자열을 일치 시키려면. –

+0

질문에 대한 내 의견보기. –

3

그것은 매우 간단합니다 :이 대소 문자를 구분하는 방식으로 단일 문자 인스턴스와 일치하는 데 유용

letters = 'AEIOU'.chars 

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

합니다. 여기 Regexp.union은 그 문자들 중 하나와 일치하는 하나의 정규식을 만듭니다.

+1

나에게 더 단순 해 보이지 않는다 – Asara

+1

작은 제안 :''FISSION.each_char.grep ...'. –

+0

@CarySwoveland 왜'each_char' 대'chars'입니까? – tadman

0

가까운 사이. 그것은 String#count의 작은 알려진 기능을 사용하여 실제로 매우 간단합니다

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