1

我有一个带有一堆NSNumbers 的数组。当用户停止拖动它时,UISlider我会得到一个特定的值。我想从数组中获取关闭号码。

因此,例如,如果用户拖动UISliderto 13,并且NSArray包含NSNumberswith1015; 我想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];

如何从数组中获取正确的数字?

4

2 回答 2

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];
    }];

现在有四种可能:

  1. 的每个元素values都大于targetNumber:index为零。
  2. 的每个元素values都小于targetNumber:indexvalues.count
  3. valuescontains targetNumber:indextargetNumberin的索引values
  4. indexvalues是大于的最小元素的索引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];
于 2012-12-29T23:42:12.663 回答
2

如果您的values数组是有序的,并且您总是希望该值大于(或等于)输入的值,您可以执行以下操作:

NSInteger count = 0;
do {
    count++;
} while (enteredNum > [values[count] intValue]);

// Do something with [values[count] intValue]
于 2012-12-29T23:23:07.553 回答