如何使用NSPredicate过滤数组以获得单词组合

时间:2012-09-20 10:11:13

标签: ios nspredicate

[filteredArray filterUsingPredicate:
   [NSPredicate predicateWithFormat:@"self BEGINSWITH[cd] %@", searchText]];

filteredArray包含简单的NSStrings。 [你好,我的,上,下,等等......];

它将提供以searchText开头的所有字符串。

但是如果字符串是“我的名字是”和searchText = name之类的单词的组合。 NSPredicate看起来会是什么样的?

更新: 如果我想要searchText = name的结果,而不是searchText = ame的结果,那该怎么办呢?也许是这样的:

 [filteredArray filterUsingPredicate:
       [NSPredicate predicateWithFormat:
        @"self BEGINSWITH[cd] %@ or self CONTENTS[cd] %@", 
        searchText, searchText]];

但它应首先显示以searchText开头的字符串,并且仅显示包含searchText的字符串。

2 个答案:

答案 0 :(得分:5)

[NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText];

扩展问题后编辑

NSArray *beginMatch = [filteredArray filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:
    @"self BEGINSWITH[cd] %@", searchText]];
NSArray *anyMatch = [filteredArray filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:
    @"self CONTAINS[cd] %@", searchText]];

NSMutableArray *allResults = [NSMutableArray arrayWithArray:beginMatch];
for (id obj in anyMatch) {
   if (![allResults containsObject:obj]) {
      [allResults addObject:obj];
   }
}
filteredArray = allResults;

这将得到所需顺序的结果,没有重复的条目。

答案 1 :(得分:2)

编辑实际上是从字符串的开头到搜索字符串长度的检查。如果发现完全匹配,则过滤

if u have name game tame lame
search Text : ame
filtered text would be: none

还包含从字符串开头到搜索字符串长度的检查,但是如果找到了开头,中间或结尾的精确搜索字符串,那么它就会被过滤。

if u have name game tame lame
search Text : ame
filtered text would be: name game tame lame because all has ame

[NSPredicate predicateWithFormat:@"self CONTAINS '%@'", searchText];