2015-10-15 95 views
1

我有NSMutableArray,它存儲NSDictionary。考慮以下包含NSDictionary的數組。查找存儲在NSDictionary中的值的索引和存儲到NSMutableArray中的NSDictionary

<__NSArrayM 0x7f9614847e60>(
{ 
    "PARAMETER_KEY" = 1; 
    "PARAMETER_VALUE" = ALL; 
}, 
{ 
    "PARAMETER_KEY" = 2; 
    "PARAMETER_VALUE" = ABC; 
}, 
{ 
    "PARAMETER_KEY" = 3; 
    "PARAMETER_VALUE" = DEF; 
}, 
{ 
    "PARAMETER_KEY" = 4; 
    "PARAMETER_VALUE" = GHI; 
}, 
{ 
    "PARAMETER_KEY" = 5; 
    "PARAMETER_VALUE" = JKL; 
} 
) 

我可以找到使用下面的代碼的具體NSDictionary指數。

int tag = (int)[listArray indexOfObject:dictionary]; 

但如果我有PARAMETER_VALUE = GHI並使用這個值,我想找到那本字典數組索引。我不想使用for循環。我可以得到沒有for循環的索引嗎?

回答

2

您可以NSArray這樣添加category(這確實一種安全檢查爲好;處理僅字典數組):

- (NSInteger)indexOfDictionaryWithKey:(NSString *)iKey andValue:(id)iValue { 
    NSUInteger index = [self indexOfObjectPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) { 
     if (![dict isKindOfClass:[NSDictionary class]]) { 
      *stop = YES; 
      return false; 
     } 

     return [dict[iKey] isEqual:iValue]; 
    }]; 

    return index; 
} 

然後只需撥打indexOfDictionaryWithKey:andValue:直接在數組對象的景氣指數。

就在,如果你想獲得的字典對象的是陣列的情況下,在NSArray添加一個以上的類別:

- (NSDictionary *)dictionaryWithKey:(NSString *)iKey andValue:(id)iValue { 
    NSUInteger index = [self indexOfDictionaryWithKey:iKey andValue:iValue]; 

    return (index == NSNotFound) ? nil : self[index]; 
} 
1

您可以使用NSPredicate用於此目的:

// Creating predicate 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.PARAMETER_VALUE MATCHES %@",@"GHI"]; 

// Filtering array 
NSArray *filteredArr = [arr filteredArrayUsingPredicate:predicate]; 

// If filtered array count is greater than zero (that means specified object is available in the array), checking the index of object 
// There can be multiple objects available in the filtered array based on the value it holds (In this sample code, only checking the index of first object 
if ([filteredArr count]) 
{ 
    NSLog(@"Index %d",[arr indexOfObject:filteredArr[0]]); 
} 
+0

好多個詞典,這有沒有循環在他的代碼中,但在數組上迭代兩次。 –

+0

@ AminNegm-Awad:你確定這是nspredicate和indexOfObject的工作原理嗎? (意思是管理裏面的循環?) –

+0

它必須將每個實例與謂詞進行比較。所以它必須迭代。 '-indexOfObject:'必須做同樣的事情,也許它可以使用哈希查找,但我不這麼認爲。 (這隻會在極少數情況下才能帶來好處。) –

0

那麼,一個有辦法一一列舉。根據您的要求從字面上(沒有for循環),您可以使用快速枚舉。然而,該任務可同時運行,因爲你只需要讀訪問:

__block NSUInteger index; 
[array enumerateObjectsWithOptions: NSEnumerationConcurrent 
        usingBlock: 
^(NSDictionary *obj, NSUInteger idx, BOOL *stop) 
{ 
    if([obj valueForKey:@"PARAMETER_VALUE" isEqualToString:@"GHI") 
    { 
    index = idx; 
    *stop=YES; 
    } 
} 
4

您可以使用NSArrayindexOfObjectPassingTest方法:

[listArray indexOfObjectPassingTest:^BOOL(NSDictionary* _Nonnull dic, NSUInteger idx, BOOL * _Nonnull stop) { 
     return [dic[@"PARAMETER_VALUE"] isEqualToString:@"GHI"]; 
}]; 

而且請考慮使用indexesOfObjectsPassingTest,如果你能有同樣的PARAMETER_VALUE

相關問題