iOS 数组相同对象进行分组,存储到新的数组

时间:2018年8月13日 周一

数组相同对象进行分组,存储到新的数组
直接上实现代码
在设计上增强了方法的扩展性,可以对字符串、非字符串对象进行筛选,用了predicate方式进行筛选操作,具体实现如下:

/*
 筛选数组中的对象的相同个数,分组存储,是自定义的对象
 isString:是否字符串数组,不是的话就自定义对象数组,需要指定对象的筛选的key,即对象的属性名
 */
+ (NSArray *)filterMaxItemsArray:(NSArray *)array isStringObj:(BOOL)isString filterKey:(NSString *)key {
    NSMutableArray *origArray = [NSMutableArray arrayWithArray:array];
    NSMutableArray *filerArray = [NSMutableArray array];
    
    while (origArray.count > 0) {
        id obj = origArray.firstObject;
        NSPredicate *predic = nil;
        if (isString) {
            predic = [NSPredicate predicateWithFormat:@"self == %@",obj];
        }else {
            id value = [obj valueForKey:key];
            predic = [NSPredicate predicateWithFormat:@"self.%@ == %@",key,value];
        }
        
        NSArray *pArray = [origArray filteredArrayUsingPredicate:predic];
        [filerArray addObject:pArray];
        [origArray removeObjectsInArray:pArray];
    }
    
    return filerArray;
}

测试一下效果:

    NSArray *array1 = @[@"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-01",@"2018-7-02",@"2018-7-03",
                        @"2018-7-04",@"2018-7-06",@"2018-7-08",
                        @"2018-7-05",@"2018-7-07",@"2018-7-09"];
    NSArray *darray = [DataTools filterMaxItemsArray:array1 isStringObj:YES filterKey:nil];
    NSLog(@"%@",darray);
2018-08-13 10:35:25.042 testDemo[12908:6785403] (
        (
        "2018-7-01",
        "2018-7-01",
        "2018-7-01",
        "2018-7-01",
        "2018-7-01",
        "2018-7-01"
    ),
        (
        "2018-7-02",
        "2018-7-02",
        "2018-7-02",
        "2018-7-02",
        "2018-7-02",
        "2018-7-02"
    ),
        (
        "2018-7-03",
        "2018-7-03",
        "2018-7-03",
        "2018-7-03",
        "2018-7-03",
        "2018-7-03"
    ),
        (
        "2018-7-04"
    ),
        (
        "2018-7-06"
    ),
        (
        "2018-7-08"
    ),
        (
        "2018-7-05"
    ),
        (
        "2018-7-07"
    ),
        (
        "2018-7-09"
    )
)

对非字符串对象的筛选效果也是OK的,就是在传参的时候传要筛选对象的一个键名,就好了。

推荐阅读更多精彩内容