2011-12-29 81 views
0

假设你有一个浮点数5.9476386和一个NSArray浮点数1,4,8,12,...以升序存储。圆浮漂浮在阵列

NSArray *centers = [NSArray arrayWithObjects: 
        [NSNumber numberWithDouble:1], 
        [NSNumber numberWithDouble:4], 
        [NSNumber numberWithDouble:8], 
        [NSNumber numberWithDouble:12], 
        ... 
        nil]; 

我想要一个新的浮点数将数字四舍五入到数组中最接近的数字。 所以在这种情况下,新浮点数将为4,因为4是5.9476386中数组中最接近的数字。

我怎样才能做到这一点?我正在Objective-C/Cocoa工作

+0

这是远远不够的信息。通过“数组”,你的意思是C数组,还是'NSArray'?数组是否已排序?请编辑你的问题来澄清它。 – outis 2011-12-29 17:38:19

回答

0

假设你的数组中的升序排序

for (int j=0; j< [myArray count]; j++) { 
    float current = [((NSNumber *)[myArray objectAtIndex: j ]) floatValue]; 
    if (current > myFloatNumber) { 
     if (j==0) { return current;} // 

     float prev = [((NSNumber *)[myArray objectAtIndex: j-1 ]) floatValue]; 

     if (fabs(prev-myFloatNumber) > fabs(current-myFloatNumber)) { 
      return current; 
     } else { 
      return prev; 
     } 
    } 
} 
+0

我在想,如果这是一个简单的解决方案。我想我会用这个。谢谢您的帮助。 – 2011-12-29 18:16:25

2

一个O(N)解决方案(其中N是数组中的项目数)是循环遍历数组,计算距离d = | float - a [i ] |对于数组a [i]中的每个项目,当距离最小时将值a [i]存储起来。

+1

假设数组已排序,如果数组可能很大,还可以应用二进制搜索。当然,当你发现第一个值大于你的值时,你应该停止寻找(再次,如果数组已被排序)。 – 2011-12-29 17:45:38

0

遍历数组并计算浮点数与浮点数的差值并比较结果的绝对值。

2

假设数组排序 - 只有当它的排序 - 您可以使用二进制搜索,这是由法-indexOfObject:inSortedRange:options:usingComparator:(假设的iOS≥4.0)提供:

// assume theArray is an NSArray of NSNumber sorted in ascending order. 

double target = 5.9476386; 

NSUInteger count = [theArray count]; 
NSNumber* targetNumber = [NSNumber numberWithDouble:target]; 

NSUInteger index = [theArray indexOfObject:target 
          inSortedRange:NSMakeRange(0, count) 
            options:NSBinarySearchingInsertionIndex 
          usingComparator:^(id x, id y) { 
               return [(NSNumber*)x compare:y]; 
              }]; 

由于二进制搜索只返回被≥目标值5.9476386最小数,我们必须把它与数组中的上一个项目比较,看看哪一个更接近实际是:

// for simplicity, I assume the array has at least 1 object here. 
NSNumber* before = [theArray indexOfObject:(index == 0 ? 0 : index-1)]; 
NSNumber* after = [theArray indexOfObject:(index == count ? count-1 : index)]; 
double absDiffBefore = fabs([before doubleValue] - target); 
double absDiffAfter = fabs([before doubleValue] - target); 
return absDiffBefore < absDiffAfter ? before : after;