2013-03-08 2 views
0

У меня есть список допустимых размеров для объекта пользовательского интерфейса на моем дисплее (значения, при которых фоновое изображение разбивается так, как я его хочу), и я хочу, чтобы высота каждого объекта была поочередно и округлена до следующего наивысшее значение в этом списке. Например, если список содержал 49, 83, 114, 148 и 179, и если бы я прошел в 1 я получил бы 49, если я прошел в 30 я получил бы 49, если я прошел в 50 я получаю 83 и т. Д. Очевидно, я собираюсь написать отдельный метод, чтобы вернуть один из допустимых размеров и вызвать его по каждому объекту по очереди.Округление поплавка до ближайшего значения в заранее определенном списке?

Я довольно новый программист, и я пытаюсь разработать эффективный способ сделать это. Моя идея состояла в том, чтобы запустить цикл while, добавив его к значению, пока оно не станет равным одному из заданных значений, а затем вернет это заданное значение. Это должно сработать, потому что в нем нет десятичных знаков, но я сомневаюсь, насколько безопасен. Существует ли более эффективный подход, чем цикл? Я использую Objective-C для iPhone, если кто-то хочет предложить пример кода или объектов, которые я могу использовать.

+1

бинарный поиск будет лучше, если ваш список был длинный, но принятый ответ хорош для короткий список. –

ответ

2

Петля - это правильный путь, но цикл над массивом значений до тех пор, пока вы не найдете тот, который подходит. Таким образом, вы пройдете через цикл максимум в 5 раз, если имеется 5 действительных размеров. Я написал небольшой пример, используя NSInteger как тип:

- (NSInteger)findValidSize:(NSInteger)aSize 
{ 
    // create a NSArray containing NSNumber objects 
    NSArray* validSizes = @[ @49, @83, @114, @148, @179 ]; 

    for (NSNumber* validSize in validSizes) { 
     if (aSize <= [validSize integerValue]) { 
      return [validSize integerValue];  // found it 
     } 
    } 

    // nothing valid was found, now what? return the last valid size? 
    return [[validSizes lastObject] integerValue]; 
} 
+0

Это прекрасно работает, спасибо! – Luke

0

Вы можете сделать это так:

-(NSInteger)nearestNumberTo:(NSInteger)number{ 
    NSArray *[email protected][@(49), @(83), @(114), @(148), @(179)]; 
    NSInteger nearest=[array[0]integerValue]; 
    /* 
    for (NSInteger index=0; index<array.count; index++) { 
     if ([array[index]integerValue]>=number){ 
      nearest=[array[index]integerValue]; 
      break; 
     } 
    } 
    */ 
    for (NSNumber *num in array) { 
     if ([num integerValue]>=number){ 
      nearest=[num integerValue]; 
      break; 
     } 
    } 
    return nearest; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{ 
    //49, 83, 114, 148, and 179 
    NSInteger minimum=[self nearestNumberTo:86]; 
    NSLog(@"%ld",minimum); 

} 
Смежные вопросы