在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray

Posted

技术标签:

【中文标题】在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray【英文标题】:Filter NSMutableArray on the base of filtering another NSMutableArray 【发布时间】:2015-06-26 12:04:57 【问题描述】:

我有 3 个大小相同的 NSMutableArrays。它们是“链接的”,这意味着对于相应的索引,它们具有彼此相关的内容。

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 得到的结果过滤另外两个NSMutableArrays。

所以我创建了另外两个NSMutableArrays,分别称为“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

将 nsmutablearray 复制到另一个视图控制器中的另一个 nsmutablearray 在数组中显示空值

使用 NSPredicate 过滤 NSDictionary 的 NSMutableArray