如何避免NSMutableArray中的重复字典对象

时间:2013-07-01 09:06:01

标签: iphone objective-c

您好,在我的某个应用程序中,我有一个包含一组NSMutableDictionary个对象的数组。字典对象有三个键值对,如下所示

  1. 公司
  2. 产品
  3. 具有多个对象的数组。现在通过使用不同的添加按钮,我将这些字典对象添加到数组中。即使在向数组添加对象时,我也会使用NSNotFound方法检查是否有任何重复对象可用。如下所示

    if([Array indexOfObject:dicObject] == NSNotFound)
    {  
            [Array addObject:dicObject];
    }
    

    在这种情况下,它在少数情况下工作正常,但在其他情况下它不起作用。我将用一个例子来解释:

    1. 例如,我在数组中有一个带有以下键值对的dicobject

      company:XYZ Product:ABC Quantity:2

    2. 现在,例如,我想添加一个具有相同上述键值对的dic对象。那个时候显然它不会添加,因为数组中已经有相同的产品。

      这是有效的条件。

      例外情况:例如,我想添加一个具有以下值的产品

      Company:XYZ    Product:ABC   Quantity:6
      

      在这种情况下,此产品正在添加到数组中而没有任何错误。但我担心的是我不想再将数据添加到数组中,只需要更新数量,因为公司和产品名称都是相同的。那么请你告诉我处理这种情况的方法。

2 个答案:

答案 0 :(得分:5)

您可以使用indexOfObjectPassingTest:来了解数组中是否已存在类似的字典。

这看起来像这样:

NSMutableArray *arr = // your array
NSDictionary *dicObject = // your object

NSUInteger indexOfDicObject = [arr indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
{
    return ([obj[@"company"] isEqualToString:dicObject[@"company"]] &&
            [obj[@"product"] isEqualToString:dicObject[@"product"]]);
}];

if (indexOfDicObject == NSNotFound)
{
    [arr addObject:dicObject];
}
else
{
    NSNumber *quantity = arr[indexOfDicObject][@"quantity"];
    arr[indexOfDicObject][@"quantity"] = @([quantity intValue] + [dicObject[@"quantity"] intValue]);
}

我做了以下假设:

  • company值为NSString;
  • product值为NSString;
  • quantity值是一个整数,存储在NSNumber

另请参阅trojanfoe's answer,如果您可以按类替换词典,则会更好。

答案 1 :(得分:3)

我认为你需要改变方向;首先创建一个自定义对象来保存您的公司,产品和数量,并确保您实施isEqual:hash方法。

然后只需将自定义对象存储在NSMutableSet对象中,这将确保不存在重复项。

您的自定义对象现在将成为应用程序的主要Model对象(即在MVC中提供'M',Cocoa和Cocoa Touch应用程序所基于的设计模式),您会发现它将会随着应用程序的增长,一遍又一遍地重复使用。