2012-04-23 4 views
3

私は、任意の長い文字列(10000文字)を検索し、特定のキーワードが文字列内で繰り返される回数を見つける方法を探しています。これはどうすればできますか?iPhone iOS文字列内の単語の大文字小文字を区別しない件数を数える方法は?

私はこのメソッドを持っています。これは、文字列がキーワードの周りで分割された後に残ったフラグメントの数をかなりカウントしますが、大文字と小文字は区別されません。

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

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


} 

文字列内のキーワードの数をカウントするためのより良い方法は何ですか?その後、

答えて

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); 
+0

これはプロです!これはまさに私が探していたもののように見えます。大文字と小文字を区別しないように検索する前に文字列を小文字に変換します –

+0

解決策が大文字小文字を区別しない検索( 'NSCaseInsensitiveSearch')を行っているように見えるので、文字列を小文字に変換する必要はありません。 – mttrb

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); 
} 
+0

非常に良いキャッチ、私はその方法を忘れてしまいました! –

1

を持っています

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

そして

ran.length 
ran.location 
を見て:それはあなたを助けることができる、しかし、あなたは(すべてではない)必要な仕事の一部を行うことができ、100%確実ではありません

ran.locationは、最初のオカレンスの文字列内の場所を提供します。次に、このオカレンスの後に文字列を切り取り、文字列の最後までこれを再度実行することができます。

+0

これは文字列の最初の出現の長さだけを返します。ポスターは大文字と小文字を区別しない出現の総数を探しています。 –

+0

あなたは正しいですが、私が言及したように、それは100%の解決策ではありません。私は助けることができる情報を追加します。 – TommyG

関連する問題