我正在寻找一种搜索任意长字符串(10000个字符)的方法,并查找字符串中特定关键字重复的次数。怎么办呢?
我有这种方法,几乎可以计算字符串在关键字周围分割后留下的片段数,但它不区分大小写。
-(void)countKeywords
{
NSArray* components = [self.salesCopy componentsSeparatedByString:@"search term"];
NSLog(@"search term number found: %i",components.count);
}
计算字符串中关键字数量的更好方法是什么?
答案 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将为您提供第一次出现的字符串中的位置。然后,您可以在发生此事件后剪切字符串,然后再次运行该字符串直到字符串结束。