2014-06-27 15 views
5

Używam NSPredicate do filtrowania NSDictionary według listy stanów i krajów.Jak mogę użyć NSPredicate do wybrania dokładnego wyrażenia z tablicy?

Wszystkie dane są przechowywane w oddzielonych przecinkami tablicy: @ "Alabama" @ "Alaska" @ "Arizona" @ "Arkansas" @ "California" @ "Colorado", itp

Istnieją jednak 2 sytuacje, w których występują duplikaty. Stan „New Mexico” zawierają słowo „Mexico” i „Arkansas” zawiera słowo „Kansas.

Oto kod podstawowy Używam zdefiniować predykat.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location contains[c] %@", @"Kansas"]; 

Jak mogę upewnij się, „Kansas” nie zwraca obiektów z „Arkansas”? Korzystanie BEGINSWITH albo jak nie działa, ponieważ lista zaczyna się od jakiegoś innego stanu.

Dzięki!

+0

Co o '@„Lokalizacja ==% @” '? –

+0

Po prostu wypróbowałem i wydaje się, że jest to tak samo jak przy użyciu BEGINSWITH lub LIKE. Dzięki za pomysł. – Jonah

+2

Co masz na myśli mówiąc "lista zaczyna się od jakiegoś innego stanu"? operatory == lub LIKE powinny wybrać dokładną frazę ... –

Odpowiedz

4

Zobaczymy, czy dobrze rozumiem. Masz słownik, w którym znajduje się klucz "Lokalizacja", którego obiektem jest ciąg znaków z nazwami stanu oddzielonymi przecinkami. Wygląda na to, że potrzebujesz dopasować wyrażenie regularne.

NSString* expr = [NSString stringWithFormat:@"^%[email protected]*|.*, %[email protected]*", @"Kansas"] 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Location MATCHES[c] %@", expr]; 

Teraz tutaj jest, jak będzie zachowywać się na różnych przykładach:

@{@"Location": @"Kansas, Arkansas, Alabama"} //Pass 
@{@"Location": @"Alabama, Kansas"} //Pass 
@{@"Location": @"Arkansas, Alabama"} //Fail 

Wyrażenie regularne ^%[email protected]*|.*, %[email protected]* testy jeśli słowo warunkiem jest albo na początku łańcucha lub następnie znaków i ",", co umieszcza go w środku. %[email protected] pobiera pierwszy parametr, dzięki czemu można go używać wielokrotnie, zamiast kilkukrotnie przypisać ten sam ciąg znaków.

+0

Czy możesz wyjaśnić, co się dzieje, gdy tworzysz ciąg znaków? @ "^% 1 $ @. * |. *,% ​​1 $ @. *" – Jonah

+0

Zaktualizuję odpowiedź z wyjaśnieniem. –

+1

Zgaduję, że mówisz, że "Kansas" jest albo pierwszym obiektem, albo jest poprzedzone "," Czy to prawda? – Jonah

1

Może to pomaga?

// If I understood correctly, then your locations in the dictionary are like this 
NSString *locations = @"Alabama, Alaska, Arizona, Arkansas"; 

NSString *trimmedLocations = [locations stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
NSMutableArray *compoments = [[trimmedLocations componentsSeparatedByString:@","] mutableCopy]; 
//now in components we have this: @[@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado"] 

[compoments filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject isEqualToString:@"Kansas"]; 
}]]; 

BOOL match = compoments.count; 
if (match) { 
    //do something with locations... 
} 
1
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Location IN %@", myStatesArray]; 
1

myślę co chcesz jest dokładną wyszukiwania mecz orzecznik:

NSPredicate * orzecznik = [NSPredicate predicateWithFormat: @ "Lokalizacja == [c]% @" @” Kansas "];

Czy rozumiem Twoje pytanie nieprawidłowo?

1

To będzie działać:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString]; 

jak zapałki struny? i * jako symbole wieloznaczne. [C] wskazuje, że w porównaniu należy rozróżniać wielkość liter.

Jeśli nie chcesz? i * należy traktować jako symbole wieloznaczne, można użyć == zamiast takich jak:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString]; 

Więcej informacji w formacie NSPredicate predykatów String Składnia documentation.

1
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location matches[c] %@", @"Kansas"]; 

To musi pomóc w rozwiązaniu problemu.

1

Spróbuj predicate z matches słowa kluczowego, to daje dokładny wynik meczu i dlatego można usunąć duplikaty wystąpienie w orzecznika jako below-

NSArray *[email protected][@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location contains[CD] %@", @"Kansas"]; 
NSMutableArray *filterdArray=[yourArr filteredArrayUsingPredicate:predicate]; 
if(filterdArray.count>0) 
{ 
NSLog(@"Invalid State"); 
} 
Powiązane problemy