2013-11-01 1 views
0

Я новичок в ios.NSMutableArray of NSMutableDictionary, как фильтровать с использованием regex

У меня есть NSMutableArray от NSDictionary. Как фильтровать массив?

//sections is a NSMutableArray of NSMutableDictionary elements 

[sections addObject:getName]; 
NSSortDescriptor *sortDescriptorFirst = [NSSortDescriptor sortDescriptorWithKey:@"first" ascending:YES]; 
     NSSortDescriptor *sortDescriptorLast = [NSSortDescriptor sortDescriptorWithKey:@"last" ascending:YES]; 

     NSSortDescriptor *descriptor=[NSArray arrayWithObjects:sortDescriptorFirst,sortDescriptorLast,nil]; 

     NSArray *sortedArray =[sections sortedArrayUsingDescriptors:descriptor]; 

Как продолжить код отсюда, чтобы соответствовать массиву с значением регулярного выражения?

+0

Есть ли причина, по которой вам нужно использовать регулярное выражение? вы можете использовать NSPredicate? –

ответ

0

Если я правильно понял ваш вопрос, вам нужна строка, содержащая все значения словаря . Это было бы:

NSString *str = [[dict allValues] componentsJoinedByString:@" "]; 

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

+0

Спасибо. Это именно то, что мне нужно. Не могли бы вы немного объяснить, что делает эта линия? Что такое allValues ​​и почему эти компонентыJoinedByString? –

+0

@justME: 'allValues' возвращает * массив * всех значений словаря, а' componentsJoinedByString' возвращает * строку * со всеми элементами массива, соединенными данным разделителем. Для получения дополнительной информации см. Документацию NSDictionary и NSArray. –

+0

Почему вы присоединились к элементам с помощью @ ""? Эта строка одинакова с созданием NSMutableString и конкатенацией всех NSString * Name = [dict valueForKey: @ "first"]; (@"последний")? –

0

Ok от взгляда вашего поста это выглядит, как вы можете просто использовать NSPredicate вместо RegEx

попробовать что-то вдоль линий этого:

NSPredicate* p = [NSPredicate predicateWithFormat:@"key = %@", value]; 
NSArray* matches = [arrayOfDicts filteredArrayUsingPredicate:p]; 

NSPredicate могут использовать все виды операторов такие как LIKE, != и <

, если вам нужно фильтровать на основе значения, находящегося в списке, вы можете построить предикат вдоль линий @"key IN %@", arrayOfPossibleValues

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

+0

Мне нужно использовать регулярное выражение, потому что мои входные значения могут быть: [a-c0] [m-p5]. Это означает, что мне нужно отфильтровать все, что содержит a, b, c, m, n, p или 0 или 5 в NSDictinary для всех ключей. –

+0

Мне очень жаль, что я не указал это. Я добавил это [разделы enumerateObjectsUsingBlock:^(NSDictionary * dict, NSUInteger idx, BOOL * stop) { NSString * str = [dict valueForKey: @ "first"]; NSTextCheckingResult * match = [regex firstMatchInString: str options: 0 range: NSMakeRange (0, [str length])]; if (match) {...} Не могли бы вы рассказать мне, как установить в NSString * str объекты для ключа = @ "last"? –

+0

Я до сих пор не понимаю, почему вы не можете использовать NSPredicate. просто используйте '@" ключ IN% @ ", arrayOfValues' –