2015-07-12 48 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

應用程序完全基於它。用戶搜索相關術語,然後選擇單元格以查看其詳細信息。 –