Array ordering / selection according to elements -

given that time1 < time2 < time3 < time4 … (and are all Time objects)

myarray= [ time1, time2, time3, time4, time5 , time6 , time7 , … ]

special_sort(time4)= [ time3, time4, time5 ]

…basically, passing an arg of a certain obj in the array to a
“special_sort” func, how do i collect the “nearest” ones to it? thx for
any suggestions

2007/11/13, Shai R. [email protected]:

given that time1 < time2 < time3 < time4 … (and are all Time objects)

myarray= [ time1, time2, time3, time4, time5 , time6 , time7 , … ]

special_sort(time4)= [ time3, time4, time5 ]

…basically, passing an arg of a certain obj in the array to a
“special_sort” func, how do i collect the “nearest” ones to it? thx for
any suggestions

Define “nearest”. What happens if time4 is not present in the array
itself? etc.

Cheers

robert

On Nov 13, 9:16 am, Shai R. [email protected] wrote:

Posted viahttp://www.ruby-forum.com/.
You could do something like this. It only would work for exact
matches.

–Dale M.

class Array
def predecessor(index)
return nil if index == 0
self[index-1]
end
def successor(index)
return nil if index > (self.length-1)
self[index+1]
end
def near(value)
return nil unless index = self.index(value)
[ self.predecessor(index), self[index], successor(index) ]
end
end

a = [1, 2, 3, 4, 6, 7, 8, 9]

puts a.near(0).inspect # not found
puts a.near(1).inspect
puts a.near(2).inspect
puts a.near(3).inspect
puts a.near(4).inspect
puts a.near(5).inspect # not found
puts a.near(6).inspect
puts a.near(7).inspect
puts a.near(8).inspect
puts a.near(9).inspect
puts a.near(10).inspect # not found

Shai R. wrote:

given that time1 < time2 < time3 < time4 … (and are all Time objects)

myarray= [ time1, time2, time3, time4, time5 , time6 , time7 , … ]

special_sort(time4)= [ time3, time4, time5 ]

…basically, passing an arg of a certain obj in the array to a
“special_sort” func, how do i collect the “nearest” ones to it? thx for
any suggestions

min is O(n), gives you only the closest:
array.min { |a,b| (closest_to - a).abs <=> (closest_to - b).abs }

sort_by is O(nlogn), but you can use first(n) to get the n closest
values:
array.sort_by { |e| (closest_to - e).abs }.first(n)

Regards
Stefan

Try to include time4 on the array, then sort it. Lood in wich position
is time4, then get the time before e after it. Isn’t very efficient,
but works :smiley:

2007/11/13, Robert K. [email protected]: