我知道这个问题听起来很糟糕。我无法找到更好的方法,所以我会花时间来解释我正在努力解决的问题。
我有一个iPhone应用程序从用户接收输入。我有一个plist(我很快将它转换为在线数据库)我目前做的是这个。我将输入字符串与我的plist中的项目的成分部分进行比较。
这是plist格式
<array>
<dict>
<key>category</key>
<string>desert</string>
<key>numberOfPerson</key>
<string>3</string>
<key>recipeImage</key>
<string>asd.jpg</string>
<key>time</key>
<string>15</string>
<key>recipeName</key>
<string>Puding</string>
<key>recipeDetail</key>
我将输入与recipeIngredients进行比较。但我的代码所做的并不是我需要的。如果比较变为真,我只列出我的plist中包含输入成分的每个项目。我可以过滤选定的食谱但我想要的是什么是这样的:除非与输入和成分完全匹配,否则我不想展示它。
问题是这个。我得到了我的配方成分,如1汤匙糖,1汤匙盐,100克鸡肉。
用户输入诸如 - salt,sugar之类的输入。鸡,所以我无法完全比较它。它永远不会是一样的,所以我无法展示任何东西。
我怎样才能做到这一点。
我愿意接受任何建议。
这是我比较的方式
results = [arrayOfPlist filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSDictionary *_dataRow = (NSDictionary *)evaluatedObject;
return ([[[_dataRow valueForKey:@"recipeIngredients"] lowercaseString] rangeOfString:[searchText lowercaseString]].location != NSNotFound);
}]];
其中searchText是我的输入。
答案 0 :(得分:1)
首先,您永远不会知道用户输入中是否存在拼写错误。
但是你能做的就是在比较两个字符串之前,你可以对给定的字符集做一点修剪。
NSString
类中有一个名为:
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
如果你想摆脱。或 - 字符,您需要在字符集中指定它们。比,你可以比较两个字符串。
答案 1 :(得分:1)
使用-[NSPredicate predicateWithFormat:]
,您可以进行数据库式字符串比较。例如,您可以尝试
[NSPredicate predicateWithFormat:@"recipeIngredients CONTAINS[cd] %@", searchText]
查看https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html名为“String Comparisons”的部分
编辑:如果用户将一次搜索多个内容,例如“鸡肉,面条”,那么您可能会更喜欢这样做:
NSArray *tokens = [[searchText componentsSeparatedByCharactersInSet:NSCharacterSet.alphanumericCharacterSet.invertedSet] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"];
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"recipeIngredient CONTAINS[cd] (ANY %@)", tokens]
答案 2 :(得分:0)
您应该使用searchText
将-componentsSeparatedByString:@","
拆分为数组,然后遍历数组以查看recipeIngredients
是否包含searchText
中的任何成分数组。为了确定查询是否包含每个成分,您可以在块内创建一个整数,并在每次匹配时递增它。如果匹配的数量等于成分的数量,那么你可以从那里开始。
答案 3 :(得分:0)
下面的代码构建了一个谓词,归结为“成分含糖,成分含有巧克力”
NSArray* recipes = @[
@{@"recipeIngredients": @"sugar flour chocolate"},
@{@"recipeIngredients": @"sugar chocolate"},
@{@"recipeIngredients": @"flour chocolate"},
@{@"recipeIngredients": @"chocolate"},
];
NSString* search = @"sugar, chocolate";
// split the ingredients we have into an array of strings separated by ',' or ' '
NSArray* haves = [search componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@", "]];
// Build a list of recipeIngredients CONTAINS have
NSMutableArray* ands = [NSMutableArray new];
for(NSString* have in haves)
{
if(have.length > 0)
{
[ands addObject:[NSPredicate predicateWithFormat:@"recipeIngredients CONTAINS[cd] %@", have]];
}
}
// String all the haves into a single long ... AND ... AND ... predicate
NSPredicate* predicate = [NSCompoundPredicate andPredicateWithSubpredicates:ands];
// Apply the predicate
NSArray* filtered = [recipes filteredArrayUsingPredicate:predicate];