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 に答える