使用NSString作为搜索项来查找NSArray项目索引

时间:2012-11-21 19:42:23

标签: objective-c ios nsstring nsarray

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

我有一个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字符串不同,我仍然希望它匹配,并且能够返回匹配的索引。

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

这可能吗?

5 个答案:

答案 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)

不是您问题的确切解决方案。但是沿着这些方向的事情应该可以解决问题。

  1. 根据分隔符“”和“_”分隔数组中的单词,并将所有单词转换为小写。
  2. 将这些数组与searchTerm制作的数组进行比较。像,
  3. 尝试,

    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”的子字符串。
在你的地方,我会用一个查找“相似字符串”的方法创建一个类别。我首先使用空格字符作为分隔符将字符串分成标记,然后建立一个标准,例如,建立字符串是相似的,如果所有单词是字符串的子串,也是不区分大小写的比较。