我有一堆NSNumber
个数组。从UISlider
开始,当用户停止拖动时,我会得到一定的值。我想从数组中得到结束数字。
例如,如果用户将UISlider
拖至13
,NSArray
包含NSNumbers
10
和15
;我想从数组中获取15
。
数组示例:
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];
如何从阵列中获取正确的数字?
答案 0 :(得分:12)
在您的帖子中,数组已排序。如果它总是排序,您可以使用二进制搜索。 NSArray
有一个方便的方法:
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
是targetNumber
中values
的索引。index
是values
中最小元素的索引,大于targetNumber
。我已按照我们处理它们的顺序巧妙地列出了这些案例。这是案例1:
if (index == 0) {
return [values[0] floatValue];
}
以下是案例2:
if (index == values.count) {
return [[values lastObject] floatValue];
}
我们可以一起处理案例3和4:
CGFloat leftDifference = targetNumber - [values[index - 1] floatValue];
CGFloat rightDifference = [values[index] floatValue] - targetNumber;
if (leftDifference < rightDifference) {
--index;
}
return [values[index] floatValue];
答案 1 :(得分:2)
如果你的values
数组是有序的,并且你总是希望值大于(或等于)输入的值,你可以这样做:
NSInteger count = 0;
do {
count++;
} while (enteredNum > [values[count] intValue]);
// Do something with [values[count] intValue]