如何从包含同一对象的许多实例的数组中获取不同的对象

时间:2015-01-16 14:14:39

标签: ios objective-c cocoa-touch

我有一个包含许多对象的数组(itemArray)。这些对象中的每一个(我们将其称为item对象)都具有包含项标识符的属性,该标识符指示它是什么类型的项。我们称之为IID

现在,用户将使用该应用程序将item的实例添加到itemArray,并且用户可以添加几个相同的实例(例如,4 item s,每个都有IID的3)。最终,itemArray将包含数百个item的实例,并且这些实例将不按特定顺序添加,并且可能有多个实例与数组中的其他实例相同(4 item的{​​{1}}为3 {2} IIDitem为6等等。

我需要创建一个数组(让我们称之为IID),它将能够根据tempArray给出数组中对象的摘要。我不需要在IID中计算每种类型的对象,我只需要在itemArray中为item添加1个tempArray实例item 1}}。

所以,例如:

如果我的itemArray看起来像这样:

itemArray

然后我需要item.IID = 4 item.IID = 3 item.IID = 4 item.IID = 6 item.IID = 4 item.IID = 5 item.IID = 6 item.IID = 3` 看起来像这样:

tempArray

item.IID = 4 item.IID = 3 item.IID = 6 item.IID = 5 只根据tempArrayitemArray中显示各种对象。

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果您可以根据item假设item等于另一个IID,我会实施检查isEqual的{​​{1}}方法s(如果它们相同则返回IID),然后使用YES获取“已过滤”列表(一旦您在评论中提到订单对您不重要)。像这样:

NSSet

正如@jlehr所记得的那样,你也需要覆盖@implementation YourItem - (BOOL)isEqual:(id)object { if (self != object) return NO; if (![self.class isKindOfClass:[object class]]) return NO; return self.IID == object.IID; } @end 。你可以通过实现这样的事情来做到这一点:

- (NSUInteger)hash

(Mike Ash写的great post详细解释了Equality and Hashing)

然后......

- (NSUInteger)hash
{
    /* every property that will make it equals to another object */
    return [self.IID hash] ^ [self.name hash] /* ... ^ */;
}

如果您想再次将其转换为NSSet *tempSet = [NSSet setWithArray:itemArray];

NSArray

答案 1 :(得分:1)

如果我理解正确,我会使用NSDictionary解决这个问题,并且只有在密钥不存在时才会插入项目(item.iid是字典的键)。

你可以询问字典是否有对象或它有密钥,两者都可以正常工作。

答案 2 :(得分:0)

可以从数组中创建NSSet,然后从NSSet创建NSArray。

NSSet * tempSet = [NSSet setWithArray:yourArray]; NSArray * tempArray = [tempSet allObjects];