我有一个包含Order对象列表的NSArray,一个Order对象有三个属性(id,typeID和description),我想根据typeID过滤我的数组以排除重复项.重复项由typeID确定,例如,如果有2个类型为ID = 7的项目,那么我想选
我的带有Order对象的src数组:
Item 1: id=1, typeID=7, description="some text 1" Item 2: id=2, typeID=7, description="some text 2" Item 3: id=3, typeID=5, description="some text 3" Item 4: id=4, typeID=5, description="some text 4" Item 5: id=5, typeID=8, description="some text 5"
应用过滤器后,我返回的数组应如下所示:
Item 2: id=2, typeID=7, description="some text 2" Item 4: id=4, typeID=5, description="some text 4" Item 5: id=5, typeID=8, description="some text 5"
有人可以建议这样做的最佳方式,谢谢.
方法一:– (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL(^)(id obj,NSUInteger idx,BOOL * stop))谓词
我想的是:
__block NSMutableSet *uniqueTypeIDs = [NSMutableSet set]; NSIndexSet *set = [myArrayOfObjects indexesOfObjectsPassingTest:^BOOL(id object, NSUInteger idx, BOOL *stop) { if([uniqueTypeIDs containsObject:[NSNumber numberWithInt:object.typeID]]) { return NO; } else { [uniqueTypeIDs addObject:[NSNumber numberWithInt:object.typeID]]; return YES; } }];
你的typeID需要转换为NSNumber吗?你决定.
返回的NSIndexSet将包含通过测试的所有对象的索引.然后,您可以对这些对象执行操作,或从阵列中删除它们.
方法二:
或者使用NSSet.如果您的对象确实是唯一的,那么将数组转换为一个集合然后返回一个数组 – 这是丢失重复对象的最简单方法.
NSSet *set = [NSSet setWithArray:array];
制作由独特对象组成的集合
[set allObjects];
为您提供集合中所有对象的数组
方法三:
另一种方法是使用类型ID作为键的NSMutableDictionary;迭代数组,并使用typeID(转换为NSNumber)作为存储索引的键.如果您发现字典中已存在密钥,请不要再次添加.结果是一个包含原始数组中唯一对象索引的字典.