当前位置 : 主页 > 手机开发 > ios >

ios – 使用object属性从NSArray中过滤复制

来源:互联网 收集:自由互联 发布时间:2021-06-11
我有一个包含Order对象列表的NSArray,一个Order对象有三个属性(id,typeID和description),我想根据typeID过滤我的数组以排除重复项.重复项由typeID确定,例如,如果有2个类型为ID = 7的项目,那么我想选
我有一个包含Order对象列表的NSArray,一个Order对象有三个属性(id,typeID和description),我想根据typeID过滤我的数组以排除重复项.重复项由typeID确定,例如,如果有2个类型为ID = 7的项目,那么我想选择具有最大ID的订单,因此在这种情况下它将是=> ID = 2.

我的带有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)作为存储索引的键.如果您发现字典中已存在密钥,请不要再次添加.结果是一个包含原始数组中唯一对象索引的字典.

网友评论