查找存储在NSDictionary和NSDictionary中的值的索引存储在NSMutableArray中

时间:2015-10-15 08:44:41

标签: ios objective-c iphone ipad

NSMutableArray存储了NSDictionary。请考虑以下包含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循环的情况下获得索引吗?

4 个答案:

答案 0 :(得分:4)

您可以使用indexOfObjectPassingTest的{​​{1}}方法:

NSArray

此外,如果您可以使用相同[listArray indexOfObjectPassingTest:^BOOL(NSDictionary* _Nonnull dic, NSUInteger idx, BOOL * _Nonnull stop) { return [dic[@"PARAMETER_VALUE"] isEqualToString:@"GHI"]; }];

的多个词典,请考虑使用indexesOfObjectsPassingTest

答案 1 :(得分:2)

您可以像这样category添加NSArray(这也会进行类型安全检查;只处理字典数组):

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

答案 2 :(得分: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]]);
}

答案 3 :(得分: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;
  }
}