2014-12-18 3 views
1

У меня есть массив, заполненный 0, 1, 3 и 4, и вы хотите проверить внутри массива, так что, если определенное количество из них найдено, утверждение становится ложным.Поиск в массиве ruby ​​

ответ

3

Используйте метод count.

alist.count(4) >= n 
# => true or false 

n будет определенный номер, который вы хотите проверить.

0

документация является лучшим местом, чтобы начать отвечать на такие вопросы, рубин имеет очень богатый набор функций на Array и Enumerable

def enough_4s?(array, how_many) 
    array.count(4) >= how_many 
end 

array = [1,1,1,2,3,4,4,4] 
enough_4s?(array, 3) 
#=> true 
enough_4s?(array, 4) 
#=> false 
+1

так '.Count (4)> x' короче я не вижу необходимо для дополнительной функции –

+0

, потому что он документирует намерение – errm

0

[0,1,3,4,3].­count(4) > 2 => false

(например, 2 является ожидаемый счет)

0

Если цель состоит в немедленном порядке stop поиск по местоположению достаточно 4 с, используйте each или find или эквивалент, и return или break, а не count. Например:

n = 2 
([0,1,3,4]*5).find do |i| 
    n -= 1 if i == 4 
    break false if n == 0 
end 
# false 
+0

'return' здесь не годится (' LocalJumpError: неожиданный возврат') –

+0

@UriAgassi: В примере, который я написал, не используется 'return'. Он использует 'break'. Один с «каждым» мог бы сделать то же самое. Один с «map» тоже был бы похож (не забудьте вернуть «i» в этом случае, иначе вы получите массив «nil».) –

+0

Вы говорите в своем объяснении «... и' return' или 'break'" - 'return' не будет работать ... –

0

Другое решение, которое прекращается, как только он может основан на использовании any?:

def has_at_least?(arr, val, min) 
    arr.any? do |i| 
    i == val && (min -= 1).zero? 
    end 
end 

has_at_least?([0,1,3,4]*5, 4, 2) 
# => true 

has_at_least?([0,1,3,4]*5, 4, 7) 
# => false 
Смежные вопросы