【问题标题】:Filter NSMutableArray on the base of filtering another NSMutableArray在过滤另一个 NSMutableArray 的基础上过滤 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"} .......... ............. { } )

标签: ios objective-c xcode nsmutablearray filtering


【解决方案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
    

    它将完美运行。 快乐编码。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多