这似乎是一件容易解决的事情,但到目前为止,我还没有想出一个简单的解决方案。
我有一个NSArray,其中包含一些字符串,如下所示:
NSArray *items = [NSArray arrayWithObjects:@"page_standard", @"google_map_location", @"comment", @"folder", nil];
我提供了一个搜索字词,但格式略有不同:
NSString *searchTerm = @"Standard Page Format";
另一个术语可能是:
NSString *searchTerm = @"Location Google Map";
因此,即使我的searchTerm
格式与数组中的page_standard
字符串不同,我仍然希望它匹配,并且能够返回匹配的索引。
注意:这不是用户可编辑的搜索。相反,这些是代码的“代码”和“友好名称”。我需要匹配这两个,以便“友好名称”可以找到匹配的“代码”。
这可能吗?
答案 0 :(得分:1)
如果提前知道了一组术语,并且用户从列表而不是自由格式文本条目中选择,只需创建一个将“友好”术语映射到内部术语的词典:
NSDictionary *internalTermForFriendlyTerm = @{
@"Standard Page Format": @"page_standard",
@"Location Google Map": @"google_map_location",
// etc.
};
...
NSString *internalTerm = internalTermForFriendlyTerm[searchTerm];
您可以将字典存储在属性列表文件中,以便在运行时轻松更新。
答案 1 :(得分:0)
天真的解决方案是将字符串拆分为由“”和“_”分隔的小写字组,并选择具有最大交集的集合。这将使您足够接近适合您的测试用例,但您可能希望进一步优化它以实现真正的面向用户的搜索功能(例如,用户可能会写“正常”而不是“标准”,或者他们可能想要“loc”找到位置。)
编辑:根据您的评论,它看起来像是内部而不是面向用户。在这种情况下,最简单的解决方案可能是将它们全部放在字典中,其中“友好名称”作为键,“代码”作为相应的值。通过这种方式,它是明确的,你可以在“友好名称”中留有很大的余地。
答案 2 :(得分:0)
不是您问题的确切解决方案。但是沿着这些方向的事情应该可以解决问题。
searchTerm
制作的数组进行比较。像,尝试,
NSMutableSet *set1 = [NSMutableSet setWithArray:originalFirstWordArray];
NSMutableSet *set2 = [NSMutableSet setWithArray:searchTermArray];
[set1 intersectSet:set2];
NSArray *result = [set1 allObjects];
根据results
数组的计数,您可以确定它是否匹配。基本上你可能需要与searchTermArray
左右比较。
更新:根据您上次的修改,我觉得您只需将这些关键字作为键值对存储在plist中,并在需要时进行比较。如果搜索是用户可编辑的搜索,我的上述答案是合适的。
答案 3 :(得分:0)
尝试以下方法:
- (NSString*)find:(NSString*)term in:(NSArray*)terms {
for (NSString *item in terms) {
NSMutableSet *dictSet = [NSMutableSet set];
for (NSString *word in [item componentsSeparatedByString:@"_"]) {
[dictSet addObject:[word lowercaseString]];
}
NSMutableSet *testSet = [NSMutableSet set];
for (NSString *word in [term componentsSeparatedByString:@" "]) {
[testSet addObject:[word lowercaseString]];
}
if ([dictSet isEqualToSet:testSet]) {
return item;
}
}
return nil;
}
答案 4 :(得分:0)
计算机无法区分两个略有不同的字符串。这里的意思是找到“相似的字符串”。
为此,rangeOfString方法完成了这项工作。
如果是“google_map_location”,则“位置”,“Google”和“地图”字符串都是“google_map_location”的子字符串。
在你的地方,我会用一个查找“相似字符串”的方法创建一个类别。我首先使用空格字符作为分隔符将字符串分成标记,然后建立一个标准,例如,建立字符串是相似的,如果所有单词是字符串的子串,也是不区分大小写的比较。