Проверьте, содержит ли NSArray какой-либо int - PullRequest
16 голосов
/ 07 августа 2011

У меня есть NSMutableArray из NSNumbers. В основном я просто хочу проверить, есть ли какое-либо из NSNumbers в массиве = какое-то значение.

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

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

Я читал кое-что о NSPredicate, это кажется хорошим решением, но я не уверен, как его использовать с NSArray.

Любой ответ приветствуется.

Спасибо

Ответы [ 6 ]

20 голосов
/ 19 декабря 2012

Вдохновленный Бернштейном, я нашел дополнительную информацию и нашел CFArrayContainsValue

BOOL CFArrayContainsValue(CFArrayRef theArray, CFRange range, const void *value);

Пример:

NSArray *numbers;
NSNumber *value;
BOOL found = CFArrayContainsValue ( (__bridge CFArrayRef)numbers, 
                                    CFRangeMake(0, numbers.count), 
                                    (CFNumberRef)value );

Работает как шарм и действительно быстр!

12 голосов
/ 28 февраля 2013
    NSPredicate *valuePredicate=[NSPredicate predicateWithFormat:@"self.intValue == %d",[myValueNumber intValue]];

    if ([[numbersArray filteredArrayUsingPredicate:valuePredicate] count]!=0) {   
        // FOUND
    }

    else  {
       //NOT FOUND
    }
5 голосов
/ 07 августа 2011

Итерация по массиву - лучший подход.Это именно то, что метод containsObject делает под прикрытием.Вы могли бы отсортировать массив, но это не принесло бы вам особого эффекта в плане эффективности.

Если вы хотите иметь возможность искать значения быстрее, чем O (n), NSArray/NSMutableArray, вероятно, неправильная структура данных для вас.

3 голосов
/ 16 ноября 2012

немного поздно, но так как массив уже упорядочен (отсортирован), вам следует использовать CFArrayBSearchValues ​​(), который выполняет двоичный поиск.

пример с числами:

NSArray *array; // or NSMutableArray
NSNumber *value; // search value
CFArrayBSearchValues((__bridge CFArrayRef)array, CFRangeMake(0, array.count),                   
        (CFNumberRef)value, (CFComparatorFunction)CFNumberCompare, NULL);
2 голосов
/ 12 сентября 2012

Итерация через NSArray - это нормально, если вы не делаете это слишком много.И это то, что делает "containsObject".Но я обнаружил, что когда вам нужно много-много таких проверок, особенно если массивы большие, это замедлит ваше приложение ...

Так что, если это проверка, которую вам нужно делать часто, вы всегда можете использовать словарьвместо массива.Где ключ будет NSNumber, а поле будет количество раз, которое он появляется в массиве.Затем вы используете «ObjectForKey», чтобы проверить, находится ли число в массиве, вы используете «allKeys», чтобы получить все значения, если это необходимо, и т.д ...

Удачи

1 голос
/ 15 февраля 2019

Вы можете просто проверить так:

if ([myArray indexOfObject:@(myNumber)] == NSNotFound) {
    NSLog(@"myArray' contauns 'myNumber");
}

Keep Coding ..........:)

...