2014-06-27 7 views
5

Ich verwende ein NSPredate, um ein NSDictionary nach einer Liste von Staaten und Ländern zu filtern.Wie kann ich ein NSPredicate verwenden, um eine genaue Phrase aus einem Array auszuwählen?

Alle Daten werden in einem Komma getrennt Array gespeichert: @ "Alabama", @ "Alaska", @ "Arizona", @ "Arkansas", @ "California", @ "Colorado", etc

Es gibt jedoch zwei Situationen, in denen Duplikate auftreten. Der Zustand „New Mexico“ enthält das Wort „Mexiko“ und „Arkansas“ enthält das Wort „Kansas.

Hier wird der Grundcode ist ich bin mit dem Prädikat zu definieren.

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

Wie kann ich stellen Sie sicher, „Kansas“ nicht zurück Objekte mit „Arkansas“? mit BEGINSWITH oder LIKE funktioniert nicht, weil die Liste mit einem anderen Zustand beginnt.

Dank!

+0

Was ist '@„Location ==% @“entfernen '? –

+0

Ich habe es gerade versucht und es scheint das gleiche wie mit BEGINSWITH oder LIKE zu sein. Danke für die Idee. – Jonah

+2

Was meinst du mit "die Liste beginnt mit einem anderen Staat"? operators == oder LIKE sollte die genaue Phrase auswählen ... –

Antwort

4

Mal sehen, ob ich das richtig verstehen. Du hast ein Wörterbuch, in dem es ein Schlüssel "Location", dessen Objekt eine Zeichenfolge mit durch Kommas getrennten Zustandsnamen ist. Klingt so, als ob Sie einen regulären Ausdruck benötigen.

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

Jetzt ist hier, wie es für verschiedene Beispiele verhalten würde:

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

Der reguläre Ausdruck ^%[email protected]*|.*, %[email protected]* prüft, ob das bereitgestellte Wort entweder zu Beginn der Zeichenfolge oder Zeichen gefolgt und ",", was es in die Mitte setzt. %[email protected] nimmt den ersten Parameter, so dass es mehrmals verwendet werden kann, anstatt die gleiche Zeichenfolge mehrmals zu teilen.

+0

Können Sie erklären, was passiert, wenn Sie die Zeichenfolge mit diesem erstellen? @ "^% 1 $ @. * |. *,% ​​1 $ @. *" – Jonah

+0

Ich werde die Antwort mit einer Erklärung aktualisieren. –

+1

Ich vermute, du sagst, dass "Kansas" entweder das erste Objekt ist, oder ihm ein "," vorausgeht. Ist das ungefähr richtig? – Jonah

1

Kann dies helfen?

// 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

Ich denke, was Sie wollen, ist eine genaue Übereinstimmung Prädikat Suche:

NSPredicate * Prädikat = [NSPredicate predicateWithFormat: @ "Location == [c]% @", @“ Kansas"];

Verstehe ich Ihre Frage falsch?

1

Es funktioniert:

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

wie Streichhölzer Strings mit? und * als Wildcards. Das [c] zeigt an, dass der Vergleich zwischen Groß- und Kleinschreibung unterscheiden sollte.

Wenn Sie nicht wollen? und * als Platzhalter behandelt werden, können Sie == statt LIKE:

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

Mehr Informationen im NSPredicate Prädikat Format String Syntax documentation.

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

Dies muss Ihnen bei der Behebung helfen.

1

Versuchen Sie predicate mit matches Stichwort, es wird Ihnen das genaue Ergebnis Spiel geben und dementsprechend können Sie das doppelte Vorkommen in das Prädikat als unten-

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"); 
}