Iphone 在二维阵列中使用NSPredicate
此问题基于我上一个问题的相同应用程序/来源,可在此处找到: 我有一个嵌套数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分) 我得到了一个错误,我不能分配足够的空间,这意味着我一定是做错了什么,我只是不知道是什么 在上述方法中,搜索部分的注释掉部分可以工作,但crayonColors只是一个简单的NSMutableDictionary,其中没有嵌套数组Iphone 在二维阵列中使用NSPredicate,iphone,objective-c,memory-management,nspredicate,multidimensional-array,Iphone,Objective C,Memory Management,Nspredicate,Multidimensional Array,此问题基于我上一个问题的相同应用程序/来源,可在此处找到: 我有一个嵌套数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分) 我得到了一个错误,我不能分配足够的空间,这意味着我一定是做错了什么,我只是不知道是什么 在上述方法中,搜索部分的注释掉部分可以工作,但crayonColors只是一个简单的NSMutableDictionary,其中没有嵌套数组 提前谢谢 据我所知,单用一个谓词是做不到的。但是,您可以在两个单独的调用中使用键路径运算符和谓词来完成此操作 所以,你有一个术语数组。
提前谢谢 据我所知,单用一个谓词是做不到的。但是,您可以在两个单独的调用中使用键路径运算符和谓词来完成此操作 所以,你有一个术语数组。您需要一个名称包含“a”的术语数组(例如)。以下是您要做的:
NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];
这里的神奇之处在于valueForKeyPath:
位。获取对象数组的数组,并返回对象数组。下面是它的作用:NSArray
将通过
将密钥路径断开,从而为其提供@unionofarray
和self
。它将使用第二个位(self)在自身上递归并调用valueForKeyPath:
,然后它将返回一个数组数组。然后它将把所有这些数组合并到一个数组中,忽略重复的数组。(如果要删除重复项,请改用@distinctunionofarray
)
一旦我们有了这个对象数组,我们就可以使用一个简单的名称来过滤它,该名称包含“blah”
谓词
(我原以为我可以使用子查询
来实现这一点,但这是一个奇怪的怪兽,对我来说没有什么是显而易见的。)
对于super intrepid,您可以使用KickingBear的collection extensions()通过一个方法调用来实现这一点,但我强烈建议不要在生产环境中使用类似的hack。:) 假定
术语
对象具有名称
属性。我的问题是“你想实现什么?”你有一个对象数组,但你想从中得到什么?(也就是说,你想得到什么对象?)所以sectionArray有一个术语对象的嵌套数组。使用NSPredicate,我试图搜索此人在搜索栏中键入的任何内容。这意味着如果他们输入“A”,我想要任何包含“A”的东西。我正在尝试将这些术语对象放入FilterDarray。但是,您是希望它们位于单个数组中,还是希望它们位于已过滤数组的数组中?或者其他什么?附带说明:如果数组包含字典,则需要将键路径更改为@unionOfArrays@self
,因为在原始键路径@unionOfArrays.self中,self
部分被解释为从字典中检索对象的键…@albertamg感谢字典提示!你们帮我省了一个小时的挠头时间。@albertamg&Dave Delong你们帮我省了很多时间。多谢!
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
// Normal table
if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count];
// Search table
//NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
//self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate];
return self.filteredArray.count;
}
NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];