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

Nar*_*esh 2 iphone objective-c

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

  1. 公司
  2. 产品
  3. 数量

并且阵列具有许多对象.现在,通过使用不同的添加按钮,我将这些字典对象添加到数组中.即使在向数组添加对象时,我也在使用NSNotFound方法检查是否有任何重复对象可用.如下

if([Array indexOfObject:dicObject] == NSNotFound)
{  
        [Array addObject:dicObject];
}
Run Code Online (Sandbox Code Playgroud)

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

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

    company:XYZ Product:ABC Quantity:2

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

这是有效的条件.

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

Company:XYZ    Product:ABC   Quantity:6
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*gis 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]);
}
Run Code Online (Sandbox Code Playgroud)

我做了以下假设:

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

另请参阅trojanfoe的答案,如果您可以按类替换字典,则更好.