2012-12-29 53 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