iPhone iOS如何计算字符串中单词不区分大小写的数量?

时间:2012-04-23 01:08:48

标签: iphone objective-c ios nsstring keyword

我正在寻找一种搜索任意长字符串(10000个字符)的方法,并查找字符串中特定关键字重复的次数。怎么办呢?

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

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

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


}

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);
}

答案 2 :(得分:1)

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

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

看看

ran.length
ran.location

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