我有一个包含许多对象的数组(itemArray
)。这些对象中的每一个(我们将其称为item
对象)都具有包含项标识符的属性,该标识符指示它是什么类型的项。我们称之为IID
。
现在,用户将使用该应用程序将item
的实例添加到itemArray
,并且用户可以添加几个相同的实例(例如,4 item
s,每个都有IID
的3)。最终,itemArray
将包含数百个item
的实例,并且这些实例将不按特定顺序添加,并且可能有多个实例与数组中的其他实例相同(4 item
的{{1}}为3 {2} IID
,item
为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
只根据tempArray
在itemArray
中显示各种对象。
提前致谢!
答案 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];