2015-07-12 118 views
0

我的字符串是NSRange非连续字符串搜索

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

如果我搜索“喜怎么样”或“你”或“谢谢”我使用NSCaseInsensitiveSearch得到的结果。

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

if(r.location!=NSNotFound) 

NSLog(@"true"); 

但是,如果我搜索“你好”或“你好”。我没有得到任何结果。

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

if(r.location!=NSNotFound) 

NSLog(@"true"); 

请帮我取得理想的效果。

感谢

+1

你的“想要的结果是什么?” – ndmeiri

+0

其实我在数组中有很多字符串,所以我正在搜索和排序包含单词的字符串,只有连续的搜索文本正在给我期望的排序。 但它也应该排序,如果我输入的搜索文本没有以连续的方式在字符串中找到。 –

+0

因此,如果“连续搜索文本”正在给出所需的结果,为什么不使用它?你能否澄清一下输出应该是什么样的,或者应该如何排列数组?除了解释之外,更多的例子可能会有所帮助。 – ndmeiri

回答

1

不知道这是否是你想要

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

那么你的意思是我需要打破搜索文本,而不是单独搜索它? –

+0

我需要它返回true,因为该字符串包含单词“你好”和“你”,但不是以连续的方式。 –

0

你实际上做的是所谓的“过滤”,而不是什么“排序”。在斯威夫特,你可以按照如下

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) 

,它将打印[a b c 2, a d c 3, a s d f c]实现所需的行为。

Objective-C中的等效代码片段如下。

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); 

这将打印("a b c 2", "a d c 3", "a s d f c")

+0

对于具有4000-5000个过滤索引的数组,这对于快速而有效吗? 我会试一试,并会回复给你。 –

+0

可能。取决于'filterString'有多少个组件。您需要过滤多久? – ndmeiri

+0

应用程序完全基于它。用户搜索相关术语,然后选择单元格以查看其详细信息。 –