Как выполнить фильтр, нечувствительный к регистру и диакритике для массива NSDictionaries (не NSString)?

У меня есть множество словарей. Я хотел бы отфильтровать этот массив, проверяя, содержит ли поле @ "name" каждого словаря заданную строку.

Загвоздка в том, что я хотел бы сделать мою фильтрацию нечувствительной к регистру и диакритическим знакам.

Если бы массив содержал только строки, я мог бы легко использовать NSPredicate. Однако это не так, и я не вижу способа, которым NSPredicate может приспособиться к этой ситуации.

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

Есть ли где-нибудь хорошее решение для этого?


person emmby    schedule 05.02.2010    source источник
comment
Нечувствительность к диакриту часто называют складкой акцента. Это проблема, связанная с данными, с таблицами и т. Д. - вы можете найти код и данные для этого в Интернете, например github.com/aristus/accent-folding/blob/master/ accent-fold.js   -  person Ben Zotto    schedule 05.02.2010


Ответы (2)


Проверьте верхний ответ на этот вопрос:

Неамериканские символы в заголовках разделов для UITableView

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

person Stefan Arentz    schedule 05.02.2010

Как насчет чего-то вроде:

NSArray * array = .....
NSString * searchString = @"foo";
NSArray * filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString]];
person Dave DeLong    schedule 05.02.2010
comment
Ах, я не понимал, что ты можешь это сделать. Хороший. На самом деле это не сработает для моего конкретного случая, потому что я чрезмерно упростил пример - массив содержит смесь словарей и строк, поэтому у предиката должен быть язык, чтобы как-то различать два случая, что, как я подозреваю, выходит за рамки его возможности. Это кажется более изящным решением, чем решение @St3fan, поэтому я попробую его в следующий раз, когда столкнусь с этой проблемой. - person emmby; 07.02.2010
comment
@Mike один из способов взломать это - добавить категорию в NSString, которая определяет -[NSString name], что просто return self;. Таким образом, вы можете выполнить предикат, ищущий name как в словарях, так и в строках. - person Dave DeLong; 07.02.2010