Как найти максимальное значение и позицию в NSMutableArray - PullRequest
2 голосов
/ 23 ноября 2011

Мне нужно найти в изменяемом массиве максимальное значение и вернуть его позицию и значение. Я только хотел бы пройтись по массиву один раз, и я не уверен, что это возможно

пример того, чего я пытаюсь достичь, может быть продемонстрирован ниже

    NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i<20; i++)
        [array addObject:[NSNumber numberWithInteger:(arc4random()%200)]];

    NSObject *max = [array valueForKeyPath:@"@max.self"];

объект max только содержит значение (а не позицию). это можно продемонстрировать через отладчик с print-object max

Есть какой-нибудь совет?

Ответы [ 4 ]

4 голосов
/ 23 ноября 2011

Использование valueForKeyPath:@"@max.self" отлично, но только если вы хотите максимальное значение.

Чтобы узнать индекс и значение за одну итерацию, я бы использовал enumerateWithBlock:

NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i = 0; i<20; i++)
    [array addObject:[NSNumber numberWithInteger:(arc4random()%200)]];

__block NSUInteger maxIndex;
__block NSNumber* maxValue = [NSNumber numberWithFloat:0];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSNumber* newValue = obj;
    if ([newValue isGreaterThan:maxValue]) {
        maxValue = newValue;
        maxIndex = idx;
    }
}];

Довольно много кода, но вы выполняете итерацию только один раз в массиве.

3 голосов
/ 23 ноября 2011

Если вас не беспокоит возможность наличия более одного идентичного максимального значения в массиве, вы можете использовать -indexOfObject: для получения индекса.Он вернет первое вхождение объекта в массиве.

NSUInteger index = [array indexOfObject:max];
2 голосов
/ 24 июля 2013

Надеюсь, следующее решение поможет вам определить максимальное значение из массива.

int max = [[numberArray valueForKeyPath:@"@max.intValue"] intValue];    
NSLog(@"Highest number: %i",max);

Пожалуйста, дайте мне знать, если возникнет какая-либо проблема.

1 голос
/ 20 августа 2013

Здесь вы можете найти правильный способ борьбы с коллекциями и KVC Его хорошая Пост Мэттом http://nshipster.com/kvc-collection-operators/

...