在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray
Posted
技术标签:
【中文标题】在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray【英文标题】:Filter NSMutableArray on the base of filtering another NSMutableArray 【发布时间】:2015-06-26 12:04:57 【问题描述】:我有 3 个大小相同的 NSMutableArray
s。它们是“链接的”,这意味着对于相应的索引,它们具有彼此相关的内容。
tableData = [NSMutableArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", nil]
thumbnails = [NSMutableArray arrayWithObjects:@"egg_benedict.jpg", @"mushroom_risotto.jpg", @"full_breakfast.jpg",nil]
prepTime = [NSMutableArray arrayWithObjects:@"10min", @"15min", @"8min",nil]
这来自我正在玩的教程。
我正在像这样过滤 tableData 数组:
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"SELF contains[cd] %@",
searchText];
searchResultsData = [[tableData filteredArrayUsingPredicate:resultPredicate] mutableCopy];
其中searchText
是包含过滤器的字符串(例如“egg”)。
这很好用,我的意思是我有正确的过滤。 (searchResultsData
是另一个 NSMutableArray)
我需要做的是根据上面NSPredicate
得到的结果过滤另外两个NSMutableArray
s。
所以我创建了另外两个NSMutableArray
s,分别称为“searchResultThumbnails”和“searchResultPrepTime
”。
我期待这个:如果我使用单词“egg”进行过滤,我想要“tableData
”数组中包含“egg”的第一个元素(在这种情况下只有一个元素)以及缩略图中索引处的对应元素和preptime 数组。
所以用“鸡蛋”过滤后的结果应该是:
searchResultData = "Egg"
searchResultThumbnails = "egg_benedict.jpg"
searchResultPrepTime = "10min"
感谢您的帮助。
【问题讨论】:
考虑使用一个字典数组,或者——更好的是——具有适当属性的自定义类对象 并行数组是面向对象编程之前的遗留物。那时它们很容易出错,现在也没有更好的方法。 (如果您绝对必须这样做,请获取searchResultsData
中的每个项目,在tableData
中找到它的索引,然后使用这些索引在其他主数组中查找对象以填充您的搜索数组...但这仍然是个坏主意。:) )
支持@stklieme cmets,您的字典数组可能类似于 ( searchResultData = "Egg" searchResultThumbnails = "egg_benedict.jpg" searchResultPrepTime = "10min" .......... ............. )
【参考方案1】:
相信“它们是“链接”的,这意味着对于相应的索引,它们具有彼此相关的东西。”根据你的情况
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"SELF contains[cd] %@",
searchText];
searchResultsData = [[tableData filteredArrayUsingPredicate:resultPredicate] mutableCopy];
NSString *searchedText = [searchResultsData objectAtIndex:0];
NSInteger index = [tableData indexOfObject:searchedText]; //if searchedText = "Egg"
NSString *thumb = [thumbnails objectAtIndex:index];
NSString *prep= [prepTime objectAtIndex:index];
但这不是更好的方法。
你有几个选择,比如 您可以使用可能具有属性 item、thumbnail、prepTime 的自定义类。
也可以使用类似如下格式的字典数组,
array = (
searchResultData = "Egg"
searchResultThumbnails = "egg_benedict.jpg"
searchResultPrepTime = "10min"
searchResultData = "someItem"
searchResultThumbnails = "some.jpg"
searchResultPrepTime = "10min"
)
【讨论】:
【参考方案2】:试试这个:
NSArray* tableData = [NSMutableArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", nil];
NSArray* thumbnails = [NSMutableArray arrayWithObjects:@"egg_benedict.jpg", @"mushroom_risotto.jpg", @"full_breakfast.jpg",nil];
NSArray* prepTime = [NSMutableArray arrayWithObjects:@"10min", @"15min", @"8min",nil];
NSMutableArray *storedIndex = [NSMutableArray arrayWithCapacity:tableData.count];
for (NSUInteger i = 0 ; i != tableData.count ; i++)
[storedIndex addObject:[NSNumber numberWithInteger:i]];
//Now you are going to sort tabledata.. with it we will sort storedIndexs
//suppose we will compare the strings for this time
[storedIndex sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
NSString *lhs = [[tableData objectAtIndex:[obj1 intValue]] lowercaseString];
NSString *rhs = [[tableData objectAtIndex:[obj2 intValue]] lowercaseString];
return [lhs compare:rhs];
]; //now storedIndex are sorted according to sorted tableData array
NSMutableArray *sortedTableData = [NSMutableArray arrayWithCapacity:tableData.count];
NSMutableArray *sortedThumbnail = [NSMutableArray arrayWithCapacity:tableData.count];
NSMutableArray *sortedPrepTime = [NSMutableArray arrayWithCapacity:tableData.count];
[p enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
NSUInteger pos = [obj intValue];
[sortedTableData addObject:[tableData objectAtIndex:pos]];
[sortedThumbnail addObject:[thumbnails objectAtIndex:pos]];
[sortedPrepTime addObject:[prepTime objectAtIndex:pos]];
];
//Now all will be correct index relation to each other as previous
它将完美运行。 快乐编码。 :)
【讨论】:
以上是关于在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章
Obj-C - 用另一个数组过滤 NSMutableArray?
NSMutableDictionary里面的NSMutableArray如何过滤
在Objective-C中使用精确的int字典值过滤字典的NSMutableArray
使用 NSPredicates 过滤 NSMutableArray