2009-07-16 17 views
1

我目前使用下面的算法來對我的iPhone應用程序搜索:iPhone「全字」的搜索

NSRange range = [entry.englishEntry rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     if(range.location != NSNotFound) 
     { 
      [self.filteredListContent addObject:entry]; 
     } 

的問題是,當我尋找像「垃圾」這個詞我也得到了的話結果像'廢料'這是無關緊要的。我對NSRange不熟悉,搜索整個單詞的搜索算法是什麼?

回答

2

是的,你可以搜索單詞。您需要首先將字符串拆分爲組件。然後遍歷每一個並比較它們。

類似的東西:

 
    NSArray *words = [entry.english componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    for (NSString *word in words) 
    { 
     NSComparisonResult result = [word compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
     if (result == NSOrderedSame) 
     { 
     [self.filteredListContent addObject:entry]; 
     break; 
     } 
    } 
0

而是查找字符串的範圍,只是做一個不區分大小寫的比較和檢查,如果結果是NSOrderedSame

if([entry.english caseInsensitiveCompare:searchText] == NSOrderedSame){ 
    [self.filteredListContent addObject:entry]; 
} 

這將文本與整個單詞進行比較,而不僅僅是查找範圍。

+0

謝謝!但是現在它只會搜索以搜索詞開頭的字符串。 (即'Hello World!'不是通過輸入'World'來拾取的)我基本上想要在字符串數組的任何位置搜索字符串中的整個單詞。 – Kulpreet 2009-07-16 11:48:16

+0

據我所知,NSString類沒有任何方法可以讓 – lostInTransit 2009-07-20 04:00:20

3

我剛剛通過在NSString上添加一個簡單的類別來完成字邊界搜索來解決此問題。代碼如下:

@interface NSString (FullWordSearch) 

// Search for a complete word. Does not match substrings of words. Requires fullWord be present 
// and no surrounding alphanumeric characters. 
- (BOOL)containsFullWord:(NSString *)fullWord; 

@end 

@implementation NSString (FullWordSearch) 

- (BOOL)containsFullWord:(NSString *)fullWord { 
    NSRange result = [self rangeOfString:fullWord]; 
    if (result.length > 0) { 
     if (result.location > 0 && [[NSCharacterSet alphanumericCharacterSet] characterIsMember:[self characterAtIndex:result.location - 1]]) { 
      // Preceding character is alphanumeric 
      return NO; 
     } 
     if (result.location + result.length < [self length] && [[NSCharacterSet alphanumericCharacterSet] characterIsMember:[self characterAtIndex:result.location + result.length]]) { 
      // Trailing character is alphanumeric 
      return NO; 
     } 
     return YES; 
    } 
    return NO; 
} 

@end 
+0

請注意,這不區分大小寫,因此請使用rangeOfString:options: – benvolioT 2012-02-07 06:01:31

0

現在我使其更通用的,通過使用此代碼,您可以搜索目標串之間的任何字符串

NSString * strName =[entry.english lowercaseString]; 

    if ([strName rangeOfString:[searchText lowercaseString]].location != NSNotFound) { 
     [self.filteredListContent addObject:entry];}