Array index of first bigger number

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

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

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

···

On 02.06.2007 09:30, Josselin wrote:

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, Robert
that's what I was trying to avoid... I was close to Stefano's solution

···

On 2007-06-02 10:59:03 +0200, Robert Klemme <shortcutter@googlemail.com> said:

On 02.06.2007 09:30, Josselin wrote:

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