0

这似乎是一件容易解决的事情,但到目前为止我还没有想出一个简单的解决方案。

我有一个 NSArray,其中包含一些字符串,如下所示:

NSArray *items = [NSArray arrayWithObjects:@"page_standard", @"google_map_location", @"comment", @"folder", nil];

我提供了一个搜索词,但格式略有不同:

NSString *searchTerm = @"Standard Page Format";

另一个术语可能是:

NSString *searchTerm = @"Location Google Map";

因此,即使 mysearchTerm的格式与数组中的字符串不同page_standard,我仍然希望它匹配,并且能够返回匹配的索引。

注意:这不是用户可编辑的搜索。相反,这些是这些代码的“代码”和“友好名称”。我需要将两者匹配,以便“友好名称”可以找到匹配的“代码”。

这可能吗?

4

5 回答 5

1

如果事先知道一组术语,并且用户从列表而不是自由格式的文本条目中进行选择,则只需创建一个字典,将“友好”术语映射到内部术语:

NSDictionary *internalTermForFriendlyTerm = @{
    @"Standard Page Format": @"page_standard",
    @"Location Google Map": @"google_map_location",
    // etc.
};

...

NSString *internalTerm = internalTermForFriendlyTerm[searchTerm];

您可以将字典存储在属性列表文件中,以便在运行时轻松更新。

于 2012-11-21T20:02:33.843 回答
0

计算机无法区分两个略有不同的字符串。你的意思是找到“相似的字符串”。
为此,rangeOfString 方法做得很好。

对于“google_map_location”,“Location”、“Google”和“Map”字符串都是“google_map_location”的子字符串。
在您的位置,我将使用查找“相似字符串”的方法创建一个类别。我将首先使用空格字符作为分隔符将字符串划分为标记,然后建立一个标准,例如,如果所有字符串都相似,则建立一个标准单词是字符串的子字符串,比较也不区分大小写。

于 2012-11-21T20:08:37.853 回答
0

天真的解决方案是将字符串拆分为由“”和“_”分隔的小写单词集合,并选择具有最大交集的集合。这将使您足够接近以处理您的测试用例,尽管您可能希望进一步改进它以实现真正的面向用户的搜索功能(例如,用户可能会写“正常”而不是“标准”,或者他们可能想要“loc”找到位置)。

编辑:根据您的评论,看起来这都是内部的,而不是面向用户的。在这种情况下,最简单的解决方案可能是将它们全部粘贴在字典中,其中“友好名称”作为键,“代码”作为相应的值。这样一来,它就很明确了,并且您对“友好名称”的含义有很大的余地。

于 2012-11-21T19:54:34.803 回答
0

不是您问题的确切解决方案。但是沿着这些思路的东西应该可以解决问题。

  1. 根据分隔符“”和“_”分隔数组中的单词并将所有单词转换为小写。
  2. 将这组数组与由searchTerm. 就像是,

尝试,

NSMutableSet *set1 = [NSMutableSet setWithArray:originalFirstWordArray];
NSMutableSet *set2 = [NSMutableSet setWithArray:searchTermArray];
[set1 intersectSet:set2];

NSArray *result = [set1 allObjects];

根据results数组的计数,您可以确定它是否匹配。基本上你可能不得不与之比较searchTermArray

更新:根据您上次的编辑,我觉得您只需将这些关键字作为键值对存储在 plist 中,并在需要时进行比较。如果搜索是用户可编辑的搜索,我的上述答案是合适的。

于 2012-11-21T20:02:21.580 回答
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;
}
于 2012-11-21T20:03:18.673 回答