3

我正在寻找一种方法来搜索任意长字符串(10000 个字符)并查找特定关键字在字符串中重复的次数。如何才能做到这一点?

我有这种方法,它几乎可以计算字符串围绕关键字拆分后留下的片段数,但它不区分大小写。

-(void)countKeywords
{
    NSArray* components = [self.salesCopy componentsSeparatedByString:@"search term"];

    NSLog(@"search term number found: %i",components.count);


}

计算字符串中关键字数量的更好方法是什么?

4

3 回答 3

3

拆分字符串、计算零件并丢弃它们效率不高。在不创建新对象的情况下重复搜索子字符串肯定会更有效。由于字符串相对较长,您可能会受益于实施高级字符串搜索算法,例如Knuth-Morris-Pratt,以显着减少搜索时间。

这是一个应该比拆分代码更快的实现:

NSString *str = @"Hello sun, hello bird, hello my lady! Hello breakfast, May I buy you again tomorrow?";
NSRange r = NSMakeRange(0, str.length);
int count = 0;
for (;;) {
    r = [str rangeOfString:@"hello" options:NSCaseInsensitiveSearch range:r];
    if (r.location == NSNotFound) {
        break;
    }
    count++;
    r.location++;
    r.length = str.length - r.location;
}
NSLog(@"%d", count);
于 2012-04-23T01:19:05.363 回答
2

只需创建 self.salesCopy 和 searchTerm 的副本,通过 [NSString lowercaseString] 将副本设置为小写,然后执行您的代码,您将获得计数

-(void)countKeywords
{
    NSString *lowerCaseSalesCopy = [self.salesCopy lowercaseString];
    NSString *lowerCaseSearchTerm = [searchTerm lowercaseString];
    NSArray* components = [lowerCaseSalesCopy componentsSeparatedByString:lowerCaseSearchTerm];

    NSLog(@"search term number found: %i",components.count);
}
于 2012-04-23T01:15:14.160 回答
1

我不是 100% 确定这可以帮助你,但可能会做一些你需要的工作(如果不是全部):

NSRange ran = [yourString rangeOfString:wordToLookFor options:NSCaseInsensitiveSearch];

看看

ran.length
ran.location

ran.location 将为您提供第一次出现的字符串中的位置。然后,您可以在此事件发生后剪切字符串,并再次运行此操作,直到字符串结束。

于 2012-04-23T01:18:49.183 回答