Ruby, Array.select с количеством элементов - PullRequest
1 голос
/ 19 мая 2019

У меня есть этот массив

[1, 2, 3, 4, 5, 6]

Я хотел бы получить первые 2 элемента, которые больше 3.

Я могу сделать:

elements = []

[1, 2, 3, 4, 5, 6].each do |element|
  elements << element if element > 3
  break if elements.size == 2
end

puts elements

Есть ли более элегантный способ сделать это?

Есть ли в ядре Ruby что-то вроде Array.select(num_elements, &block)?

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Вы были почти там.Просто используйте break с параметром:

[1, 2, 3, 4, 5, 6].each_with_object([]) do |element, acc|
  acc << element if element > 3
  break acc if acc.size >= 2
end

Другой способ сделать это - использовать Enumerator::Lazy с array.lazy.select или явный экземпляр Enumerator сEnumerable#take (здесь это определенное излишество, публикация в основном в образовательных целях.)

enum =
  Enumerator.new do |y|
    i = [1, 2, 3, 4, 5, 6].each
    loop { i.next.tap { |e| y << e if e > 3 } }
  end
enum.take(2)
#⇒ [4, 5]

Sidenote: оба приведенных выше примера перестанут проходить ввод, как только будут найдены два элемента.

3 голосов
/ 19 мая 2019
a = [1, 2, 3, 4, 5, 6]

p a.filter {|x| x > 3}.first(2)

Или

p a.select{|x| x > 3}.first(2)

выход

[4, 5]

Как предполагает Кэри, приведенный ниже код не будет ударом по производительности, если массив будет больше, он прекратит выполнение, если будет найдено 2 элемента

a.lazy.select{|x| x > 3}.first(2)
1 голос
/ 19 мая 2019

Только для нескольких вариантов больше ..

ary.each_with_object([]) { |e, res| res << e if e > 3 && res.size < 2 }

или

ary.partition { |e| e > 3 }.first.first(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...