2015-06-26 114 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 

這將很好地工作。 快樂編碼。 :)

相關問題