2

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

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

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

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

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

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

    company:XYZ Product:ABC Quantity:2

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

这是有效条件。

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

Company:XYZ    Product:ABC   Quantity:6

在这种情况下,该产品正在添加到阵列中而没有任何错误。但我担心的是我不想再次将其添加到数组中,只需要更新数量,因为公司和产品名称都是相同的。所以你能告诉我处理这种情况的方法吗?

4

2 回答 2

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值为NSStringa ;
  • product值为NSStringa ;
  • quantity值是一个整数,存储在 a 中NSNumber

另请参阅trojanfoe's answer,如果您可以用类替换字典,那就更好了。

于 2013-07-01T09:51:03.490 回答
3

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

Then simply store your custom objects within an NSMutableSet object, which will ensure that duplicates cannot exist.

Your custom object will now become your principle Model object for the app (i.e. provide the 'M' in MVC, the design pattern upon which Cocoa and Cocoa Touch apps are based) and you will find that it will be reused over and over as the app grows.

于 2013-07-01T09:50:40.103 回答