2009-07-16 8 views
1

Je suis actuellement en utilisant l'algorithme suivant pour la recherche sur mon application iPhone:iPhone « Mot entier » Recherche

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

Le problème est que quand je cherche un mot comme « merde » Je reçois aussi des résultats pour les mots comme «ferraille» qui est hors de propos. Je ne suis pas familier avec NSRange alors quel est l'algorithme de recherche pour rechercher le mot entier?

Répondre

2

Oui, vous pouvez rechercher dans les mots. Vous devez d'abord diviser la chaîne en composants. Parcourez ensuite chacun d'eux et comparez-les.

Quelque chose comme ça:

 
    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

Ne résout pas le problème original: 'Scrap dans le cadre d'une phrase' et 'Scrap' contiennent tous les deux 'crap'. – benvolioT

0

Au lieu de trouver la gamme d'une chaîne, il suffit de cas insensible à la casse comparer et vérifier si le résultat est NSOrderedSame

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

Ce comparera le texte avec le mot entier et ne pas regarder juste pour la plage .

+0

Merci! Cependant, maintenant, il ne reprend que les chaînes qui commencent par le mot recherché. (ie 'Hello World!' n'est pas récupéré en tapant 'World') Je veux fondamentalement rechercher des chaînes entières dans un tableau de chaînes – Kulpreet

+0

À ma connaissance, il n'y a pas de méthode NSString – lostInTransit

3

Je viens de résoudre ce problème en ajoutant une simple catégorie sur NSString pour faire une recherche de limite de mot. Voici le code:

@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

Remarque: ceci n'est pas sensible à la casse Pour cela, utilisez rangeOfString: options: – benvolioT

0

Maintenant, je fais comme plus générique, en utilisant ce code, vous pouvez rechercher une chaîne entre chaîne cible

NSString * strName =[entry.english lowercaseString]; 

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