3

これが繰り返しである場合は申し訳ありませんが、正直なところ、これを調査するために最善を尽くしましたが、あまり思いつきませんでした.

いくつかの大きな教科書を検索できるようにする iPad リファレンス アプリを作成しています (合計で 3 ~ 4,000 ページになる可能性があります)。これは非常に単純なアイデアです。ユーザーが検索するテキストの任意の組み合わせを選択し、用語を入力すると、アプリはすべてのテキストからそれらの用語を検索し、テーブル ビューでインデックス付けして返します。

ビュー コントローラーには一連のスイッチがあり、その値はメソッドによって NSSet に読み込まれ、検索コントローラーに渡されます。その部分は機能します。

ビューコントローラーがインスタンス化してメソッドを呼び出す SearchController クラスがあります。

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];
        [text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                                 options:NSStringEnumerationByWords
                              usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  NSRange found = [substring rangeOfString:text];
                                  if (found.location != NSNotFound) {
                                      NSLog(@"%@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];
    }

すべてのテキストのすべての単語を列挙することに成功したようですが、戻り値が見つからないため、「見つかりません」という終わりのないストリームが得られます。

確かにそこにあることがわかっている各テキストにテスト フレーズを挿入しましたが、出てきません。

私はこれについてすべて間違っていると感じています。これが機能したとしても、使用可能なアプリにはパフォーマンスへの影響が大きすぎる可能性があります...ブロックについても頭を抱えようとしています。大量のテキストを検索して結果を選択するための既製のソリューションが見つかりませんでした。誰かが私が適応できるオープンソース ライブラリへのヒントや参照を持っている場合、私は非常に感謝しています.

4

2 に答える 2

2

ブロックに渡された各部分文字列内のテキスト全体を検索しているようです。この行が問題です (保持サイクルが発生します)。

NSRange found = [substring rangeOfString:text];

コードは、見つけられるものを探す必要があります。

NSString *findMe = @"A string we expect to find";        
[text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                         options:NSStringEnumerationByWords
                      usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  if ([findMe isEqualToString:substring] ) {
                                      NSLog(@"Found %@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];
于 2013-03-28T01:00:26.027 に答える
1

コードのブロックはあなたが望むものではないと思います。テキスト内の各単語をループして、すべての検索文字列を見つけたいとします。これは、最後に成功した一致に基づいて新しい検索範囲を設定するループです。

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];

        NSRange searchRange = NSMakeRange(0, [text length]);
        NSRange match = [text rangeOfString:searchString options:0 range:searchRange];
        while (match.location != NSNotFound) {

            // match is the range of the current successful match
            NSLog(@"matching range -- %@", NSStringFromRange(match));

            NSUInteger locationOfNextSearchRange = NSMaxRange(match);
            searchRange = NSMakeRange(locationOfNextSearchRange, [text length] - locationOfNextSearchRange);
            match = [text rangeOfString:searchString options:0 range:searchRange];
        }
    }
}
于 2013-03-28T01:27:18.093 に答える