2012-12-29 24 views
1

我有一堆NSNumber s的数组。从UISlider我得到一个特定的值,当用户停止拖动它。我想从数组中获取关闭数。从数组中挑选最接近的NSNumber

因此,举例来说,如果用户拖动UISlider13,并且NSArray包含NSNumbers1015;我想从阵列中获得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

我不明白的问题。为什么不计算该值与数组中每个元素的差异,并使用绝对值来决定哪一个最接近? – dasdom

+0

当然,我可以做到这一点。但是如果我有一个有1000个值的数组呢?这相当于一些计算和内存使用。 –

+0

在Objective-C中,数组迭代非常有效。我使用它很多,没有性能问题。试用1000个值并决定它是否足够快。解决方案只需要足够好。 – dasdom

回答

11

在您的文章,该数组排序。如果它总是被排序,则可以使用二分查找。 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的每个元素都小于targetNumberindexvalues.count
  3. values包含targetNumberindextargetNumber的索引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]; 
+1

工程就像一个魅力,除了它应该是'[values [0] floatValue]'。也似乎可持续。 –

2

如果您values阵列是为了和你总是只想大于(或等于)值输入值,你可以做这样的事情:

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

// Do something with [values[count] intValue] 
+0

好吧,然而;这意味着如果我得到11我会得到15,而不是10 ...这不是最接近的数字,因此不幸的是不是我的问题的答案。 –

+1

因此,跟踪以前和更大,然后将它们相互比较。 – Joost

+0

如果'enteredNum'大于最大值,这会崩溃,所以可能只适用于滑块约束的特定情况。 – Mundi