您好,在我的某个应用程序中,我有一个包含一组NSMutableDictionary
个对象的数组。字典对象有三个键值对,如下所示
具有多个对象的数组。现在通过使用不同的添加按钮,我将这些字典对象添加到数组中。即使在向数组添加对象时,我也会使用NSNotFound
方法检查是否有任何重复对象可用。如下所示
if([Array indexOfObject:dicObject] == NSNotFound)
{
[Array addObject:dicObject];
}
在这种情况下,它在少数情况下工作正常,但在其他情况下它不起作用。我将用一个例子来解释:
例如,我在数组中有一个带有以下键值对的dicobject
company:XYZ Product:ABC Quantity:2
现在,例如,我想添加一个具有相同上述键值对的dic对象。那个时候显然它不会添加,因为数组中已经有相同的产品。
这是有效的条件。
例外情况:例如,我想添加一个具有以下值的产品
Company:XYZ Product:ABC Quantity:6
在这种情况下,此产品正在添加到数组中而没有任何错误。但我担心的是我不想再将数据添加到数组中,只需要更新数量,因为公司和产品名称都是相同的。那么请你告诉我处理这种情况的方法。
答案 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应用程序所基于的设计模式),您会发现它将会随着应用程序的增长,一遍又一遍地重复使用。