0

を検索する次のコードがありますNSString

for (NSDictionary *obj in data) {
        NSString *objQuestion = [obj objectForKey:@"Question"];
        NSRange dataRange = [objQuestion rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (dataRange.location != NSNotFound) {
            [filteredData addObject:obj];
        }
    }

これは問題なく動作しますが、問題があります。「objQuestionGreen Yellow Red」で「Yellow Green Red」を検索すると、検索の順序が正しくないため、オブジェクトが表示されません。

単語を検索する順序に関係なく、オブジェクトが表示されるようにコードを変更するにはどうすればよいですか?

4

3 に答える 3

2

検索テキストを単語に分割し、各単語を検索する必要があります。

NSArray *wordArray= [searchText componentsSeparatedByString: @" "];
for (NSDictionary *obj in data) {
    NSString *objQuestion = [obj objectForKey:@"Question"];        
    BOOL present = NO;
    for (NSString *s in wordArray) {
        if (s) {                
            NSRange dataRange = [objQuestion rangeOfString:s options:NSCaseInsensitiveSearch];
            if (dataRange.location != NSNotFound) {
               present = YES;
            }
        } 
    }
    if (present) {
        [filteredData addObject:obj];
    }
}
于 2013-07-03T14:26:44.067 に答える
0

つまり、基本的にキーワード検索をしたいのですか?正規表現検索をお勧めします。単語の順序は任意です。

このようなもの。

(your|test|data)? *(your|test|data)? *(your|test|data)?

NSRegularExpressoin で使用できるもの

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(your|test|data)? *(your|test|data)? *(your|test|data)?" options:NSRegularExpressionCaseInsensitive error:&error];
int numMatches = [regex numberOfMatchesInString:searchString options:0 range:NSMakeRange(0, [searchString length])];];

これにより、効率的な方法で任意の順序に一致します。

現在目の前に Mac がないため、Obj C に正規表現が使用できるかどうかはわかりませんが、問題ないはずです。

于 2013-07-03T14:48:17.753 に答える