【问题标题】:Search index of NSMutableArrayNSMutableArray 的搜索索引
【发布时间】:2012-08-13 19:19:55
【问题描述】:

我需要从NSMutableArray 中搜索字符串的索引。我已经实现了代码 & 效果很好,但我需要提高搜索速度。

我使用了以下代码:

NSIndexSet *indexes = [mArrayTableData indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
    NSString *s = (NSString*)obj;
    NSRange range = [s rangeOfString: txtField.text options:NSCaseInsensitiveSearch];
    if(range.location == 0)//
        return range.location != NSNotFound;
    return NO;
}];

NSLog(@"indexes.firstIndex =%d",indexes.firstIndex);

【问题讨论】:

  • 您需要找到一个索引还是多个索引?
  • 是否需要支持部分匹配? (到目前为止,建议的答案不允许这样做)
  • 为什么你需要比你得到的速度更快的速度?我用一个包含 112,000 个单词的数组测试了你的代码,它在 0.023 秒内执行。我在下面发布的方法耗时 0.01 秒。
  • 感谢您的重播,您提供了代码,但我需要作为 iPhone 联系人进行搜索 - 如果 yourString=@"A" 或 @"An" 它应该得到 @"Another strings" 的索引作为 0
  • 您应该在原始帖子中提到这一点——这是一条重要的信息。您只想要以您的搜索字符串开头的东西,还是在中间或末尾包含搜索字符串的东西 - 您发布的代码只会找到以搜索字符串开头的东西?

标签: iphone objective-c ios nsindexset


【解决方案1】:

有一个方法indexOfObject

NSString *yourString=@"Your string";
NSMutableArray *arrayOfStrings = [NSMutableArray arrayWithObjects: @"Another strings", @"Your string", @"My String", nil];

NSInteger index=[arrayOfStrings indexOfObject:yourString];
if(NSNotFound == index) {
    NSLog(@"Not Found");
}

【讨论】:

  • 这种方法的一个问题是它不允许不区分大小写。
【解决方案2】:

如果您只需要一个索引(或者如果有多个索引,则只需要第一个),您可以使用您发布的方法的单数版本。你也不需要 if 子句:

NSInteger index = [mArrayTableData indexOfObjectPassingTest:^BOOL(NSString *obj, NSUInteger idx, BOOL *stop){
        return [obj.lowercaseString isEqualToString:txtField.text.lowercaseString];
    }];

如果要查找以搜索字符串开头的字符串,只需将 isEqualToString: 替换为 hasPrefix:。对于大型搜索集,这似乎比您发布的方法快两倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多