如何仅使用objective-c中的给定输入比较文本中的选定字符串

时间:2014-04-25 21:37:18

标签: ios objective-c nspredicate string-search

我知道这个问题听起来很糟糕。我无法找到更好的方法,所以我会花时间来解释我正在努力解决的问题。

我有一个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是我的输入。

4 个答案:

答案 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];