On Thu, Jan 24, 2013 at 10:08 PM, masta Blasta <[email protected]> wrote:
> My premise is that i have a large array that i'd like to iterate with
> select, but
> I want up to a maximum (n) number of returns. Something like
> Enum#select_first_n_matches.
>
> yes i could do my_arr.select{ blocky }.first(n). Which is a neat
> one-liner, but has the performance overhead of iterating through the
> entire array.
>
> is there a method that does this already? Anyone have any slick one-line
> solutions?

irb(main):003:0> 1_000_000.times.inject([]) {|a,x| a << x if x.odd?;
break a if a.size >= 10; a}
=> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
irb(main):004:0> 1_000_000.times.inject([]) {|a,x| x.odd? and a << x
and a.size >= 10 and break a; a}
=> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

> My working solution is:
> new_arr = []; matches = 0
> my_arr.each do |ele|
>   if condition
>      new_arr << ele
>      matches += 1
>      break if matches >= limit
>   end
> end

You can simplify that

new_arr = []

my_arr.each do |ele|
  if condition
     new_arr << ele
     break if new_arr.size >= limit
  end
end

or

new_arr = []

my_arr.each do |ele|
  condition and
     new_arr << ele and
     new_arr.size >= limit and
     break
end

Kind regards

robert


-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

-- 
[email protected] | 
https://groups.google.com/d/forum/ruby-talk-google?hl=en


Reply via email to