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

Iphone 如何避免NSMutableArray中的重复字典对象,iphone,objective-c,Iphone,Objective C,嗨,在我的一个应用程序中,我有一个数组,其中包含一组NSMutableDictionary对象。dictionary对象有三个键值对,如下所示 公司 产品 数量 和具有多个对象的数组。现在,通过使用不同的add按钮,我将这些dictionary对象添加到数组中。即使在向数组中添加对象时,我也会使用NSNotFound方法检查是否存在任何重复对象。如下 if([Array indexOfObject:dicObject] == NSNotFound) { [Array addO

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

  • 公司
  • 产品
  • 数量
  • 和具有多个对象的数组。现在,通过使用不同的add按钮,我将这些dictionary对象添加到数组中。即使在向数组中添加对象时,我也会使用
    NSNotFound
    方法检查是否存在任何重复对象。如下

    if([Array indexOfObject:dicObject] == NSNotFound)
    {  
            [Array addObject:dicObject];
    }
    
    在这里,它在少数情况下运行良好,但在其他情况下不起作用。我将用一个例子解释:

  • 例如,我在数组中有一个dicobject,其中包含以下键值对

    公司:XYZ产品:ABC数量:2

  • 例如,现在我想再添加一个具有上述相同键值对的dic对象。这一次显然不会添加,因为阵列中已经有相同的产品可用

    这是有效条件

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

    Company:XYZ    Product:ABC   Quantity:6
    

    在这种情况下,此产品将毫无错误地添加到阵列中。但我担心的是,我不想再将其添加到数组中,只需要更新数量,因为公司和产品名称都是相同的。所以,你能告诉我如何处理这种情况吗。

    我认为你需要改变策略;首先创建一个自定义对象来保存您的公司、产品和数量,并确保您实现了和方法

    然后只需将自定义对象存储在一个对象中,这将确保不存在重复的对象

    您的自定义对象现在将成为应用程序的主要模型对象(即提供“M”in,Cocoa和Cocoa Touch应用程序所基于的设计模式),并且您将发现随着应用程序的增长,它将被反复使用。

    您可以使用它来了解阵列中是否已经存在类似的词典

    这可能看起来像这样:

    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

    另请参见,如果可以用类替换词典,那么哪一个更好

    你好,鲁沙布,谢谢你的回复。实际上,我需要避免数组中的重复项而不是字典中的重复项。我的数组有字典对象。嘿,伙计,你试过NSSet或NSOrderedSet吗?它们都不允许重复项,并且可以很容易地从数组转换为数组。我喜欢这种方法,因为一旦编写了自定义对象,代码应该看起来很简单。但是,当对象具有相同的
    公司
    产品
    @boyfarrell时,他还需要包括一种“自动”将
    数量
    属性添加到一起的方法,这不是在
    isEqual:
    比较中忽略数量,并在添加对象之前检查对象是否存在的情况吗(在这种情况下,如果有,他会更新数量)?我认为这不能“自动”完成但是。我喜欢这个,这看起来很优雅。但是可能需要为gadamsetty更改更多代码。同意;但是你最终得到的模型对象将在整个应用程序中都很有用。它提供了MVC中的M。非常好和干净的解决方案!我不知道该方法!+1Hi Guillaume Algis谢谢你的回复。你的答案有些简单是什么帮助了我。