0

我知道这个问题听起来很老套。我找不到更好的表达方式,所以我会花时间解释我正在努力解决的问题。

我有一个从用户那里获取输入的 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 克鸡肉。

用户输入诸如盐、糖之类的输入。鸡肉,所以我无法完全比较它。它永远不会相同,所以我不能展示任何东西。

我怎样才能做到这一点。

我愿意接受任何建议。

这就是我比较的方式

    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

4 回答 4

1

首先,你永远不会知道用户输入是否有错别字。

但是您可以做的是在比较两个字符串之前,您可以对给定的字符集进行一些修剪。类中有一个方法NSString叫做:

- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set

如果你想摆脱 . 或 - 字符,您需要在字符集中指定它们。比,你可以比较两个字符串。

于 2014-04-25T21:55:33.830 回答
1

使用-[NSPredicate predicateWithFormat:]您可以进行数据库式字符串比较。例如,您可以尝试

[NSPredicate predicateWithFormat:@"recipeIngredients CONTAINS[cd] %@", searchText]

查看https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html名为“字符串比较”的部分

编辑:如果用户将同时搜索多个东西,比如“鸡肉,面条”,你可以更花哨一点,然后做:

NSArray *tokens = [[searchText componentsSeparatedByCharactersInSet:NSCharacterSet.alphanumericCharacterSet.invertedSet] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"];
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"recipeIngredient CONTAINS[cd] (ANY %@)", tokens]
于 2014-04-25T21:57:05.310 回答
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];
于 2014-04-25T22:16:16.943 回答
0

您应该使用 将 拆分searchText为一个数组-componentsSeparatedByString:@",",然后遍历该数组以查看 是否recipeIngredients包含数组中的任何成分searchText。为了确定查询是否包含每一种成分,您可以在块内创建一个整数,并在每次匹配时递增它。如果匹配的数量等于成分的数量,那么你可以从那里开始。

于 2014-04-25T21:52:26.650 回答