array ordering / selection according to elements -

S

Shai Rosenfeld

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
 
R

Robert Klemme

2007/11/13 said:
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
 
D

Dale Martenson

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

You could do something like this. It only would work for exact
matches.

--Dale Martenson



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
 
M

Michel Boaventura

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 :D

2007/11/13 said:
2007/11/13 said:
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
 
S

Stefan Rusterholz

Shai said:
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
 

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,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top