从数组中选择最接近的 NSNumber [英] Pick closest NSNumber from array

查看:53
本文介绍了从数组中选择最接近的 NSNumber的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含一堆 NSNumber 的数组.当用户停止拖动它时,我从 UISlider 得到一个特定的值.我想从数组中获取关闭数.

I have an array with a bunch of NSNumbers. From an UISlider I get a certain value when the user stops dragging it. I would like to get the closes number from the array.

例如,如果用户将 UISlider 拖动到 13,并且 NSArray 包含 NSNumbers使用 1015;我想从数组中获取 15.

So for instance, if the user drags the UISlider to 13, and the NSArray contains the NSNumbers with 10 and 15; I want to get 15 from the array.

数组示例:

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

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

How do I get the correct number from the array?

推荐答案

在您的帖子中,数组已排序.如果总是排序,则可以使用二分查找.NSArray 有一个方便的方法:

In your post, the array is sorted. If it's always sorted, you can use binary search. NSArray has a convenient method for that:

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. values包含targetNumber:indexvaluestargetNumber的索引.
  4. indexvalues 中大于 targetNumber 的最小元素的索引.
  1. Every element of values is larger than targetNumber: index is zero.
  2. Every element of values is smaller than targetNumber: index is values.count.
  3. values contains targetNumber: index is the index of targetNumber in values.
  4. index is the index of the smallest element of values that is greater than targetNumber.

我已经按照我们处理的顺序巧妙地列出了这些案例.这是案例 1:

I've cleverly listed the cases in the order we'll handle them. Here's case 1:

if (index == 0) {
    return [values[0] floatValue];
}

情况 2:

if (index == values.count) {
    return [[values lastObject] floatValue];
}

我们可以一起处理案例 3 和案例 4:

We can handle cases 3 and 4 together:

CGFloat leftDifference = targetNumber - [values[index - 1] floatValue];
CGFloat rightDifference = [values[index] floatValue] - targetNumber;
if (leftDifference < rightDifference) {
    --index;
}
return [values[index] floatValue];

这篇关于从数组中选择最接近的 NSNumber的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆