2015-07-12 2 views
0

Ma chaîne estNSRange chaîne non continue recherche

NSString *str= @"Hello Hi How Are You Thank you"; 

Si je recherche « Salut comment » ou « êtes-vous » ou « merci » j'obtenir le résultat en utilisant NSCaseInsensitiveSearch. Mais si je recherche comme "bonjour comment" ou "bonjour". Je n'obtiens aucun résultat.

NSRange r=[searchable rangeOfString:@"hi you" options:NSCaseInsensitiveSearch] 

if(r.location!=NSNotFound) 

NSLog(@"true"); 

Aidez-moi à obtenir le résultat souhaité.

Merci

+1

Quel est votre "résultat souhaité"? – ndmeiri

+0

En fait, j'ai beaucoup de chaînes dans un tableau, donc je suis en train de chercher et de trier les chaînes contenant les mots, seul le texte de recherche continue me donne le tri désiré. Mais il devrait aussi trier si mon texte de recherche entré n'est pas trouvé de manière continue dans la chaîne. –

+0

Donc, si "texte de recherche continue" donne le résultat souhaité, pourquoi ne pas l'utiliser? Pouvez-vous s'il vous plaît préciser ce que la sortie devrait être ou comment le tableau devrait être trié? Peut-être plus d'exemples aideraient, en plus d'une explication dans. – ndmeiri

Répondre

1

Je ne sais pas si c'est ce que vous voulez

NSString *str= @"Hello Hi How Are You Thank you"; 

NSRange r1= [str rangeOfString:@"hi" options:NSCaseInsensitiveSearch]; 
NSRange r2 = [str rangeOfString:@"you" options:NSCaseInsensitiveSearch]; 
if(r1.location!=NSNotFound && r2.location!=NSNotFound && r2.location > r1.location) 
{ 
    NSLog(@"true"); 
} 
+0

Alors voulez-vous dire que je dois casser le texte de recherche que de le rechercher séparément? –

+0

J'en ai besoin pour retourner vrai car la chaîne contient les deux mots "salut" et "vous", mais pas de façon continue. –

0

Qu'est-ce que vous êtes en train de faire est appelé « filtrage », pas « le tri. » Dans Swift, vous pouvez mettre en œuvre votre comportement souhaité comme suit

var stringArray: [NSString] = ["a b c 2", "a d c 3", "a s d f c"] 

let filterString = "a c" 

stringArray.filter { (element) -> Bool in 
    let filterComponents = filterString.componentsSeparatedByString(" ") 
    for component in filterComponents { 
     let range = element.rangeOfString(element as String, options: .CaseInsensitiveSearch) 
     if range.location == NSNotFound { 
      return false 
     } 
    } 

    return true 
} 

print(stringArray) 

qui imprimera [a b c 2, a d c 3, a s d f c].

L'extrait de code équivalent dans Objective-C est ci-dessous.

NSArray *stringArray = @[@"a b c 2", @"a d c 3", @"a s d f c"]; 

NSString *filterString = @"a c"; 
NSArray *filterComponents = [filterString componentsSeparatedByString:@" "]; 

NSMutableArray *filteredArray = [[NSMutableArray alloc] init]; 

for (NSString *string in stringArray) { 
    bool matchesFilter = YES; 

    for (NSString *component in filterComponents) { 
     NSRange range = [string rangeOfString:component options:NSCaseInsensitiveSearch]; 
     if (range.location == NSNotFound) { 
      // don't include in filteredArray 
      matchesFilter = NO; 
      break; 
     } 
    } 

    if (matchesFilter) { 
     [filteredArray addObject:string]; 
    } 

} 

NSLog(@"%@", filteredArray); 

qui imprimera ("a b c 2", "a d c 3", "a s d f c").

+0

Est-ce que ce sera rapide et efficace pour un tableau ayant 4000-5000 indices pour le filtrage? Je vais essayer et je reviendrai vers vous. –

+0

Peut-être. Cela dépend du nombre de composants de votre 'filterString'. À quelle fréquence avez-vous besoin de filtrer? – ndmeiri

+0

L'application est entièrement basée sur elle. L'utilisateur recherche des termes apparentés et sélectionne la cellule pour en voir les détails. –