我有这个数组
[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)
之类的东西?
答案 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::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]
边注:上面的两个示例都将在找到两个元素后立即停止遍历输入。
答案 2 :(得分:1)
只是还有更多选择。
ary.each_with_object([]) { |e, res| res << e if e > 3 && res.size < 2 }
或
ary.partition { |e| e > 3 }.first.first(2)