2015-06-26 70 views
0

我有3 NSMutableArray s的大小相同。他们是“联系在一起”,这意味着对于相应的索引他们有一些相互关联的东西。过滤NSMutableArray的基础上过滤另一个NSMutableArray

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] 

这来自我正在玩的教程。

我过滤资料表阵列是这样的:

NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"SELF contains[cd] %@", 
            searchText]; 

searchResultsData = [[tableData filteredArrayUsingPredicate:resultPredicate] mutableCopy]; 

其中searchText是包含过滤器(例如“蛋”)的字符串。 这很好,我的意思是我有正确的过滤。 (searchResultsData是另一个NSMutableArray) 我需要做的是根据从上面的NSPredicate得到的结果过滤另外两个NSMutableArray

所以我创建了另外两个叫做“searchResultThumbnails”和“searchResultPrepTime”的NSMutableArray。 我在期待这个:如果我使用单词“egg”进行过滤,我希望第一个包含“tableData”数组中的“egg”的元素(在这种情况下只有一个元素)以及索引处的缩略图和preptime中的对应元素阵列。

因此,与“蛋”滤波后的结果应该是:

searchResultData = "Egg" 
searchResultThumbnails = "egg_benedict.jpg" 
searchResultPrepTime = "10min" 

谢谢您的帮助。

+4

考虑使用一个字典数组或更好的 - 具有适当属性的自定义类对象 – vadian

+0

并行数组是从面向对象编程前几天开始的保留。他们现在很容易出错,现在也不行。 (如果**绝对必须**这样做,请将'searchResultsData'中的每个项目,在tableData中找到它的索引,并使用这些索引在其他主数组中找到对象以填充搜索数组...但它仍然是一个坏主意:)) –

+0

支持@stklieme评论,您的字典数组可能会像({searchResultData =“Egg” searchResultThumbnails =“egg_benedict.jpg” searchResultPrepTime =“10min”} ..... ................... {}) –

回答

0

相信“他们是”链接“,这意味着对于相应的索引他们有相互关联的东西。”作为您的情况

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]; 

但是,这不是一个更好的方法来做到这一点。

你有几个选项,如 你可以使用一个自定义类,它可能有属性项目,缩略图,准备时间。

您还可以使用类似下面的格式字典的数组,

array = (
      { 
      searchResultData = "Egg" 
      searchResultThumbnails = "egg_benedict.jpg" 
      searchResultPrepTime = "10min" 
      } 
      { 
      searchResultData = "someItem" 
      searchResultThumbnails = "some.jpg" 
      searchResultPrepTime = "10min" 
      } 
     ) 
0

试试这个:

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 

这将很好地工作。 快乐编码。 :)

相关问题