Двоичный поиск в NSMutableArray из NSDictionary - PullRequest
2 голосов
/ 22 февраля 2011

Привет всем! Первый вопрос здесь, поэтому, пожалуйста, будьте нежны :). Я немного знаком с Objective-C, но у меня есть некоторые проблемы с подробностями. Короче говоря, я хочу знать, как я могу выполнить бинарный поиск по NSMutableArray из NSDictionaries, и в этом поиске искать частичный синтаксис строки. У меня есть NSMutableArray NSDictionaries, где массив представляет собой список контактов, и каждый NSDictionary является одним контактом (с четырьмя частями информации). Мне удалось отсортировать массив, используя

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:type  ascending:YES];
[addressBook sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

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

Итак, пока я нашел -indexOfObject: inSortedRange: options: usingComparator: (и, в частности, этот пост , я не могу понять, как настроить поиск для обоих префиксов поиска строка и как реализовать синтаксис блока для самого поиска.

Я попробовал это - но я просто получаю очень полезную ошибку "Ожидаемое выражение", так как я предполагаю, что не могу заменить indexOfObjectPassingTest на indexOfObject.

unsigned index2 = [addressBook 
            indexOfObjectPassingTest:<#^BOOL(id obj, NSUInteger idx, BOOL *stop)predicate#>:^(id obj, NSUInteger idx, BOOL *stop)
                       inSortedRange:NSMakeRange(0, [addressBook count]) 
                             options:NSBinarySearchingFirstEqual 
                     usingComparator:(NSComparator^(id obj1, id obj2)];

Буду признателен за любую помощь в получении -indexOfObject: inSortedRange: options: usingComparator: работать, или если у кого-то есть другое предложение для бинарного поиска в NSArray из NSDictionaries, я все уши.

(И да, хотя это для назначения алгоритмов, оно не зависит от языка программирования. Я пытаюсь максимизировать скорость, поэтому я думал о массиве каждый раз, когда вы его просматриваете. Я также думал о создании копий массива, отсортированного по каждому ключу словаря, но поскольку мы имеем дело с большими CSV-файлами, это показалось немного чрезмерным. Поэтому любые другие специфичные для Mac асимптотические подсказки будут НАМНОГО оценены, так как это часто бывает трудно найти в документации Apple.)

1 Ответ

0 голосов
/ 23 февраля 2011

Основа Framework не позволяет вам явно указывать бинарный поиск в NSArray, если у вас уже нет объекта и вы ищете значение индекса (ну, очевидно, массивы не всегда сортируются).

Единственное, что вы можете сделать, это получить массив значений для указанного ключа, преобразовать его в CFArray (бесплатно) и использовать функцию CFArrayBSearchValue в Core Foundation.

Другая вещь, которую я хотел бы сделать, - добавить категорию в NSArray, которая использует компаратор в форме блока и реализует алгоритм двоичного поиска.

...