Ruby,带有元素数量的Array.select

时间:2019-05-19 16:43:47

标签: arrays ruby

我有这个数组

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

我想获得大于3的前2个元素。

我可以做到:

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 个答案:

答案 0 :(得分:3)

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]

正如Cary所建议的,如果数组较大,下面给出的代码不会对性能造成影响,如果找到2个元素,它将停止进一步执行

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

答案 1 :(得分:3)

您快到了。只需将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::Lazyarray.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]

边注:上面的两个示例都将在找到两个元素后立即停止遍历输入。

答案 2 :(得分:1)

只是还有更多选择。

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

ary.partition { |e| e > 3 }.first.first(2)