0

我正在尝试遍历我的数组并根据数组中对象的名称属性查找重复的对象。一旦找到重复项,我需要组合这些对象,名称和单位值保持不变,我只想将数量值加在一起。此时我想删除两个重复项并将新对象添加到数组中。

如果它的两个难以删除两个对象并添加另一个对象(可能与索引混淆?),那么可以将新对象添加到过滤数组中,只要在未找到重复项时也将其添加到该数组中。所以新数组将包含我以前的所有值,重复值结合数量。

到目前为止我有这个:

NSMutableSet* existingNames = [NSMutableSet set];
NSMutableArray* filteredArray = [NSMutableArray array];

for (id object in ingredientsArray)
{
    if (![existingNames containsObject:[object name]])
    {
        [existingNames addObject:[object name]];
        NSLog(@"%@", @"DUPLICATE FOUND");

        //create new object to store the new info in.
        ingredient *info = [[ingredient alloc] initWithname:[object name] quantity:[/* How do I add the quanitity values of the two objects that are duplicates here? */] unit:[object unit]];

        //add this to filtered array.
        [filteredArray addObject:object];

        //remove object from array.
        [ingredientsArray removeObject:object];
    }
}

谢谢

4

1 回答 1

2

您不能修改正在枚举的数组。编译器应该抱怨这个,如果没有,它应该在运行时崩溃。

我认为您的代码中的逻辑有点混乱。if 子句检查字符串是否包含在您的重复数组中 - 所以“DUPLICATE FOUND”肯定不是真的。

id在这种情况下,只进行迭代是不好的做法。如果您可以更强烈地键入对象会更好。还建议遵守诸如Capitalized类名之类的约定。

减少迭代的一个技巧是只遍历唯一名称。有一个技巧NSSet可以做到这一点:

NSArray *names = [ingredientsList valueForKeyPath:@"name"];
NSSet *uniqueNames = [NSSet setWithArray:names];
NSArray *resultArray = [NSMutableArray array];
NSPredicate *nameFilter;

for (NSString *ingredientName in uniqueNames) {
   predicate = [NSPredicate predicateWithFormat:@"name = %@", ingredientName];
   NSArray *entries = [ingredientsList filteredArrayUsingPredicate:predicate];
   Ingredient *ingredient = entries[0];
   if (entries.count > 1) {
      NSLog(@"Found %d instances of %@.", entries.count, ingredientName);
      NSNumber *sum = [entries valueForKeyPath:@"@sum.quantity"];
      ingredient.quantity = sum;
   }
   [resultsArray addObject:ingredient];
}

这假定该类Ingredient至少有两个属性,名称(NSString)和数量(NSNumber)。这也适用于普通的 NSDictionaries。

于 2013-09-08T18:14:20.680 回答