Проверьте, содержит ли NSArray некоторый int

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

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

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

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

Приветствуется любой ответ.

Спасибо

Ответ 1

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

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

Ответ 2

Вдохновленный бернштейном, я просмотрел дополнительную информацию об этом, и я нашел 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 );

Работает как шарм и очень быстро!

Ответ 3

    NSPredicate *valuePredicate=[NSPredicate predicateWithFormat:@"self.intValue == %d",[myValueNumber intValue]];

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

    else  {
       //NOT FOUND
    }

Ответ 4

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

пример с цифрами:

NSArray *array; // or NSMutableArray
NSNumber *value; // search value
CFArrayBSearchValues((__bridge CFArrayRef)array, CFRangeMake(0, array.count),                   
        (CFNumberRef)value, (CFComparatorFunction)CFNumberCompare, NULL);

Ответ 5

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

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

Удачи.