2013-06-21 12 views
8

Mam następującą sytuację:Korzystanie NSPredicate filtrować tablicy tablic

NSArray(
    NSArray(
     string1, 
     string2, 
     string3, 
     string4, 
     string5, 
    ) 
    , 
    NSArray(
     string6, 
     string7, 
     string8, 
     string9, 
     string10, 
    ) 
) 

teraz muszę predykat, która zwraca tablicę zawierającą konkretny łańcuch. np. Filter Array, który zawiera string9 -> Powinienem odzyskać całą drugą tablicę, ponieważ muszę przetworzyć inne ciągi w tej tablicy. Jakieś pomysły?

+0

mieć spojrzeć na niego i nie odpowiadać, jeśli użyteczne lub jakichkolwiek quetions [tutaj] (http://stackoverflow.com/questions/4559427/using-nspredicate-in -2d-tablice) – the1pawan

Odpowiedz

19

Tylko dla kompletności: To może być wykonane przy użyciu predicateWithFormat::

NSArray *array = @[ 
    @[@"A", @"B", @"C"], 
    @[@"D", @"E", @"F"], 
]; 

NSString *searchTerm = @"E"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", searchTerm]; 
NSArray *filtered = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@", filtered); 

wyjściowa:

 
(
    (
     D, 
     E, 
     F 
    ) 
) 
+0

+1, pracowałem nad tym z SUBQUERY, '[NSPredicate predicateWithFormat: @" SUBQUERY (SELF, $ content, $ content == [c]% @) ", string]' but didn ' t działa. Jakieś wskazówki? – Anupdas

+0

dzięki, to świetne rozwiązanie. – DanielR

+1

@Anupdas: Byłaś prawie na miejscu, '@" SUBQUERY (SELF, $ content, $ content == [c]% @). @ Count> 0 "' działa. –

1

Z tego co wiem, nie można zrobić go jako jedną wkładką więc zamiast używać predicateWithFormat: należy użyć predicateWithBlock:

coś jak to powinien robić to, co chcesz

NSString *someString = @"Find me"; // The string you need to find. 
NSArray *arrayWithArrayOfStrings = @[]; // Your array 
[arrayWithArrayOfStrings filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSArray *evaluatedArray, NSDictionary *bindings) { 
    return [evaluatedArray indexOfObject:someString] != NSNotFound; 
}]]; 

Update: Martin R okazał mi źle :)

Powiązane problemy