从数组中选择最接近的NSNumber

时间:2012-12-29 23:16:48

标签: objective-c nsarray nsnumber

我有一堆NSNumber个数组。从UISlider开始,当用户停止拖动时,我会得到一定的值。我想从数组中得到结束数字。

例如,如果用户将UISlider拖至13NSArray包含NSNumbers 1015 ;我想从数组中获取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];

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

2 个答案:

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

现在有四种可能性:

  1. values的每个元素都大于targetNumberindex为零。
  2. values的每个元素都小于targetNumberindexvalues.count
  3. values包含targetNumberindextargetNumbervalues的索引。
  4. indexvalues中最小元素的索引,大于targetNumber
  5. 我已按照我们处理它们的顺序巧妙地列出了这些案例。这是案例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]