Hello!
How would I create a function which finds and returns the closest number to a given one in an array?
So let’s say I had an array with the values of 5, 2, 3 and 8 and I wanted to get the closest number to 4.
So that’ll return 5.
Hello!
How would I create a function which finds and returns the closest number to a given one in an array?
So let’s say I had an array with the values of 5, 2, 3 and 8 and I wanted to get the closest number to 4.
So that’ll return 5.
This is a simple algorithm, looping through the array, keeping track of the closest number to 4
so far, seeing if the next number has a smaller difference becoming the new closest one. At the end the number that ended in the variable we used to keep track, is the closest.
local closest = math.huge
local number = 4
for _, otherNumber in pairs(array) do
if math.abs(number - otherNumber) < math.abs(number - closest) then
closest = otherNumber
end
end
print(number)
The closest
variable keeping track of the current closest number is initialized as math.huge
, this is a common pattern. The idea is if I did math.abs(4-math.huge)
, the result would always be math.huge
, which is guaranteed to be larger than any other number in the array, and hence guaranteed to not be the end result. It’s a nice way to not add a check to see if there was not closest, in which case the current number is automatically the current closest.
math.abs(a-b)
will basically find the distance between two numbers, mind you the distance, and not the difference. The difference between 2 and 4 is -2, assuming you mean 2-4 = -2
, but the distance is 2. If we did not abs, then 8 would be considered closer, since 8-4 = 4 > -2
, which is not the case.
I see, never mind me wanting to return 3, 5 works for my use case. Thank you for your detailed explanation, you have a very clever method!
My question has already been answered, but thank you for your reply!
I know, I’m just reminding you that you should use the search feature before creating a thread.
I did use it! But I didn’t find that post.
That’s strange because I searched for threads using the same keywords you’ve used in this thread’s title and found the following.
Yeah. When originally searching, I didn’t search for those exact titles. Mostly searched for what my title is. The search results I saw weren’t of much use.