2

我有一个包含 NSMutableDictionary 值的 NSMutableArray。我必须确定 NSMutableArray 中是否存在特定的字典值?

NSMutableArray:

表数据:

{
    {

        categories = 267;
        "category_ids" = 267;
        "created_at" = "2012-04-18 05:32:10";
        "custom_design_from" = "2010-12-03 00:00:00";
    }
    {
        categories = 267;
        "category_ids" = 267;
        "created_at" = "2012-04-18 05:32:10";
        "custom_design_from" = "2010-12-03 00:00:00";
    }
 }

我必须确定一个特定的字典值。

我的代码:

if ( [tableData containsObject:[appDelegate.Product objectAtIndex:i]] ) 
{
     // Return Always false...
}
4

3 回答 3

2

据我记得,containsObject:方法通过向其中的所有实例发送isEqual:消息来检查数组是否包含给定对象。NSDictionary 类有方法 isEqualToDictionary: comares 字典的内容。你可以试着做这样的事情

- (BOOL) dictionaryArray:(NSMutableArray*)array containsDictionary:(NSDictionary*)givenDictionary
{
    BOOL result = NO;

    for( NSDictionary* dict in array )
    {
        if( [dict isEqualToDictionary:givenDictionary] )
        {
            result = YES;
        }
    }

    return result;
}

如果您的数组通过调用包含给定字典,则此方法应返回

NSDictionary* dict = [appDelegate.Product objectAtIndex:i];
if ( [self dictionaryArray:tableData containsDictionary:dict] )
{
    // do what you need
}
于 2012-06-06T12:06:33.197 回答
0

如果 2 个字典包含相同的数据但它们不是同一个对象,则可能会发生这种情况 例如 ( NSDictionary)

NSDictionary *d1 = [NSDictionary dictionaryWithObject:@"1" forKey:@"1"];
NSDictionary *d2 = [NSDictionary dictionaryWithObject:@"1" forKey:@"1"];
if(d1 == d2)
   //Does note get called

s1 具有与 s2 相同的数据,但对象不同,因此正常的相等性测试将永远无法工作

这可能是发生在你身上的事情你可能有 2 个具有相同数据结构的字典,但它们实际上并不是同一个对象

您将不得不通过测试 NSDictionary 中的实际字符串或 id 来详细说明您的字典

于 2012-06-06T12:01:13.150 回答
0

包含相同数据的两个对象通常不相同。一个例子:

NSMutableArray* array1 = [NSMutableArray arrayWithObjects:@"a", nil];
NSMutableArray* array2 = [NSMutableArray arrayWithObjects:@"x", @"y", nil];
NSMutableArray* array3 = array2;

现在,当然,array1 与 array2 是不同的对象,而 array2 和 array3 是相同的对象。

1: a
2: x, y
3: x, y

所以,让我们改变其中之一:

[array1 replaceObjectAtIndex:0 withObject:@"x"];
[array1 addObject:@"y"];

现在所有三个数组都有相同的内容,但数组 1 和数组 2 仍然是不同的对象:

1: x, y
2: x, y
3: x, y

让我们做另一个改变:

[array2 addObject:@"z"];

由于array1 与array2 是不同的对象,因此更改array 2 不会影响array1。但是 array2 与 array3 相同(array2 和 array3 只是同一事物的两个名称):

1: x, y
2: x, y, z
3: x, y, z
于 2012-06-06T12:23:51.930 回答