Array index of first bigger number...

J

Josselin

Is there a simple function (I solve it w a loop.. C-minded) to find the
index of the first bigger element in an array

limit mini is first_element , if item < last_element
item = -2.23
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
0.0 index 0

item = 2.85
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
5.0 index 2

item = 12.55
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
15.0 index 4

limit maxi is last_element , if item > last_element
item = 36.59
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
25.0 index 5

can it be writtent in just one line or a loop is unavoidable ?

thanks

joss
 
S

Stefano Crocco

Alle sabato 2 giugno 2007, Josselin ha scritto:
Is there a simple function (I solve it w a loop.. C-minded) to find the
index of the first bigger element in an array

limit mini is first_element , if item < last_element
item = -2.23
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
0.0 index 0

item = 2.85
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
5.0 index 2

item = 12.55
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
15.0 index 4

limit maxi is last_element , if item > last_element
item = 36.59
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
25.0 index 5

can it be writtent in just one line or a loop is unavoidable ?

thanks

joss

You can do:

anArray.index(anArray.find{|i| i > item})

anArray.find will return the first element of the array for which the block
returns true, i.e the first element which is greater than item; then
anArray.index will return the index of the item. (This returns nil if no
element in the array is greater than item)

I hope this helps

Stefano
 
R

Robert Klemme

Is there a simple function (I solve it w a loop.. C-minded) to find the
index of the first bigger element in an array

limit mini is first_element , if item < last_element
item = -2.23
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
0.0 index 0

item = 2.85
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
5.0 index 2

item = 12.55
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
15.0 index 4

limit maxi is last_element , if item > last_element
item = 36.59
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
25.0 index 5

can it be writtent in just one line or a loop is unavoidable ?

Yes, it can. Just use Enumerator.

irb(main):001:0> anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0]
=> [0.0, 2.0, 5.0, 10.0, 15.0, 25.0]

irb(main):007:0> anArray.to_enum:)each_with_index).find {|n,i| n > 30}
=> nil
irb(main):008:0> anArray.to_enum:)each_with_index).find {|n,i| n > 10}
=> [15.0, 4]
irb(main):009:0> anArray.to_enum:)each_with_index).find {|n,i| n > -2.23}
=> [0.0, 0]
irb(main):010:0> val, idx = anArray.to_enum:)each_with_index).find
{|n,i| n > -2.23}
=> [0.0, 0]
irb(main):011:0> val
=> 0.0
irb(main):012:0> idx
=> 0

This also has the advantage of having to traverse the array just once
vs. the solution Stefano presented.

Kind regards

robert
 
J

Josselin

Is there a simple function (I solve it w a loop.. C-minded) to find the
index of the first bigger element in an array

limit mini is first_element , if item < last_element
item = -2.23
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
0.0 index 0

item = 2.85
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
5.0 index 2

item = 12.55
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
15.0 index 4

limit maxi is last_element , if item > last_element
item = 36.59
anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0] first_bigger_element =
25.0 index 5

can it be writtent in just one line or a loop is unavoidable ?

Yes, it can. Just use Enumerator.

irb(main):001:0> anArray = [0.0, 2.0, 5.0, 10.0, 15.0, 25.0]
=> [0.0, 2.0, 5.0, 10.0, 15.0, 25.0]

irb(main):007:0> anArray.to_enum:)each_with_index).find {|n,i| n > 30}
=> nil
irb(main):008:0> anArray.to_enum:)each_with_index).find {|n,i| n > 10}
=> [15.0, 4]
irb(main):009:0> anArray.to_enum:)each_with_index).find {|n,i| n > -2.23}
=> [0.0, 0]
irb(main):010:0> val, idx = anArray.to_enum:)each_with_index).find
{|n,i| n > -2.23}
=> [0.0, 0]
irb(main):011:0> val
=> 0.0
irb(main):012:0> idx
=> 0

This also has the advantage of having to traverse the array just once
vs. the solution Stefano presented.

Kind regards

robert

thanks, Robert
that's what I was trying to avoid... I was close to Stefano's solution
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top