3

全部,

我正在尝试使用谓词来返回搜索结果,优先考虑以搜索字符串 VS 开头的字符串。简单地包含在其中。

例如,如果搜索字符串是“Objective-C”,我希望得到过滤后的结果,如下所示:

Objective-C 入门
Objective-C 模式
Objective-C 编程
关于 Objective-C
如何在 Objective-C 中编程

这是我尝试过的,但由于它是 OR,它显然不会优先于第一个条件。有没有办法用谓词做一种“链接”?谢谢

  NSPredicate *filter = [NSPredicate predicateWithFormat:@"subject BEGINSWITH [cd] %@ OR subject CONTAINS [cd]", searchText,searchText];
  NSArray *filtered = [myArray filteredArrayUsingPredicate: filter];
4

2 回答 2

1

我认为 NSPredicate 本身没有办法处理。您似乎要求的是排序结果。在从谓词中取回结果后,您可以通过对结果进行排序来做到这一点。在这种情况下,由于排序顺序不是简单的字母顺序,您应该使用 NSArray 的-sortedArrayUsingComparator:方法。像这样的东西(未经测试,在我的脑海中输入)。

NSArray *sortedStrings = [filtered sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *string1 = (NSString *)obj1;
    NSString *string2 = (NSString *)obj2;
    NSUInteger searchStringLocation1 = [string1 rangeOfString:searchString].location;
    NSUInteger searchStringLocation2 = [string2 rangeOfString:searchString].location;
    if (searchStringLocation1 < searchStringLocation2) return NSOrderedDescending;
    if (searchStringLocation1 > searchStringLocation2) return NSOrderedAscending;
    return NSOrderedSame;
}];
于 2012-04-06T17:13:39.207 回答
1

看起来您正在尝试使用谓词对数组进行排序,或者尝试仅使用谓词进行过滤和排序。谓词返回布尔值:字符串以搜索文本开头或包含搜索文本,或者不包含。谓词不会告诉您任何有关相对顺序的信息。过滤数组会删除那些您提供的谓词返回 NO 的对象,因此只有以搜索文本开头或包含搜索文本的对象才会出现在过滤后的数组中。事实上,由于任何以搜索文本开头的字符串也包含它,因此您可以将谓词简化为“包含”部分。

如果要更改过滤结果的顺序,请使用适当的比较器对过滤后的数组进行排序。

于 2012-04-06T17:14:48.850 回答