从数组中选择最接近的 NSNumber [英] Pick closest NSNumber from array
问题描述
我有一个包含一堆 NSNumber
的数组.当用户停止拖动它时,我从 UISlider
得到一个特定的值.我想从数组中获取关闭数.
I have an array with a bunch of NSNumber
s. From an UISlider
I get a certain value when the user stops dragging it. I would like to get the closes number from the array.
例如,如果用户将 UISlider
拖动到 13
,并且 NSArray
包含 NSNumbers
使用 10
和 15
;我想从数组中获取 15
.
So for instance, if the user drags the UISlider
to 13
, and the NSArray
contains the NSNumbers
with 10
and 15
; I want to get 15
from the array.
数组示例:
NSArray *values = [NSArray arrayWithObjects:[NSNumber numberWithInt:15],
[NSNumber numberWithInt:20],
[NSNumber numberWithInt:30],
[NSNumber numberWithInt:45],
[NSNumber numberWithInt:60],
[NSNumber numberWithInt:90],
[NSNumber numberWithInt:110], nil];
如何从数组中获取正确的数字?
How do I get the correct number from the array?
推荐答案
在您的帖子中,数组已排序.如果总是排序,则可以使用二分查找.NSArray
有一个方便的方法:
In your post, the array is sorted. If it's always sorted, you can use binary search. NSArray
has a convenient method for that:
CGFloat targetNumber = mySlider.value;
NSUInteger index = [values indexOfObject:@(targetNumber)
inSortedRange:NSMakeRange(0, values.count)
options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
usingComparator:^(id a, id b) {
return [a compare:b];
}];
现在有四种可能:
values
的每个元素都大于targetNumber
:index
为零.values
的每个元素都小于targetNumber
:index
是values.count
.values
包含targetNumber
:index
是values
中targetNumber
的索引.index
是values
中大于targetNumber
的最小元素的索引.
- Every element of
values
is larger thantargetNumber
:index
is zero. - Every element of
values
is smaller thantargetNumber
:index
isvalues.count
. values
containstargetNumber
:index
is the index oftargetNumber
invalues
.index
is the index of the smallest element ofvalues
that is greater thantargetNumber
.
我已经按照我们处理的顺序巧妙地列出了这些案例.这是案例 1:
I've cleverly listed the cases in the order we'll handle them. Here's case 1:
if (index == 0) {
return [values[0] floatValue];
}
情况 2:
if (index == values.count) {
return [[values lastObject] floatValue];
}
我们可以一起处理案例 3 和案例 4:
We can handle cases 3 and 4 together:
CGFloat leftDifference = targetNumber - [values[index - 1] floatValue];
CGFloat rightDifference = [values[index] floatValue] - targetNumber;
if (leftDifference < rightDifference) {
--index;
}
return [values[index] floatValue];
这篇关于从数组中选择最接近的 NSNumber的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!