之前介紹過(guò)數(shù)組的排序,現(xiàn)在介紹數(shù)組的分組扁达。什么意思呢?由于后臺(tái)給我們的數(shù)據(jù)是一個(gè)數(shù)組蠢熄,里面有很多分類(lèi)跪解,我們把每個(gè)不同的分類(lèi)放到一個(gè)數(shù)組以便于我們使用,用一個(gè)簡(jiǎn)單的例子介紹:
[2,2,4,3,5,6,3,6,5,4]
[2,2,3,3,4,4,5,5,6,6]
[[2,2],[3,3],[4,4],[5,5],[6,6]]
介紹大致思路签孔,第一步把一個(gè)混亂的數(shù)組排序叉讥。第二步把排序好的數(shù)組按照分類(lèi)拆分多個(gè)。
下面舉一個(gè)我工作中的例子饥追。之前介紹過(guò)數(shù)據(jù)的排序下面直接進(jìn)入怎么分組的图仓。一般有兩個(gè)方法,第一種方法利用set 的不重復(fù)性來(lái)做判耕。第二種方法利用集合的KVC 運(yùn)算符來(lái)做透绩。
第一種方法利用set 的不重復(fù)性來(lái)做:
//對(duì)返回的數(shù)據(jù)進(jìn)行區(qū)分篩選
- (NSMutableArray *)groupAction1:(NSMutableArray *)arr {
NSMutableSet *set = [NSMutableSet set];
[arr enumerateObjectsUsingBlock:^(WCServiceListModelBodyV2 * _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) {
[set addObject:model.serviceType];
}];
NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:@“self" ascending:YES]];
NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDesc];
__block NSMutableArray *groupArr = [NSMutableArray array];
[sortSetArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"serviceType = %@", obj];
NSArray *tempArr = [NSArray arrayWithArray:[arr filteredArrayUsingPredicate:predicate]];
[groupArr addObject:tempArr];
}];
return groupArr;
}
大致描述:
1:數(shù)組里面存儲(chǔ)著多個(gè)model對(duì)象翘骂,現(xiàn)在我們根據(jù)model中的serviceType字段進(jìn)行分組壁熄。利用set不重復(fù)的特性,得到有多少組,根據(jù)model中的serviceType字段帚豪。
2:set本身是無(wú)序的直接排序變成有序的利用sortedArrayUsingDescriptors方法。
3:利用數(shù)組的filteredArrayUsingPredicate方法和NSPredicate語(yǔ)法進(jìn)行過(guò)濾篩選出新的數(shù)組們草丧。
注意:NSPredicate語(yǔ)法類(lèi)似寫(xiě)SQL語(yǔ)句類(lèi)似狸臣,比如過(guò)濾文章開(kāi)頭大于3返回?cái)?shù)組。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 3”];然后調(diào)用數(shù)組filteredArrayUsingPredicate方法即可昌执。
第二種方法利用集合的KVC 運(yùn)算符來(lái)做烛亦,由于上面第一種方法要循環(huán)遍歷下為了避免用循環(huán)方法。
//對(duì)返回的數(shù)據(jù)進(jìn)行區(qū)分篩選
- (NSMutableArray *)groupAction2:(NSMutableArray *)arr {
NSArray *serviceTypes = [arr valueForKeyPath:@"@distinctUnionOfObjects.serviceType"];
NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]];
NSArray *sortSetArray = [serviceTypes sortedArrayUsingDescriptors:sortDesc];
__block NSMutableArray *groupArr = [NSMutableArray array];
[sortSetArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"serviceType = %@", obj];
NSArray *tempArr = [NSArray arrayWithArray:[arr filteredArrayUsingPredicate:predicate]];
[groupArr addObject:tempArr];
}];
return groupArr;
}
大致描述:
1: @distinctUnionOfObjects: 返回一個(gè)由操作符右邊的key path所指定的對(duì)象屬性組成的數(shù)組懂拾。其中@distinctUnionOfObjects 會(huì)對(duì)數(shù)組去重煤禽。
2:對(duì)分類(lèi)進(jìn)行排序
3:和第一種方法一樣,利用數(shù)組的filteredArrayUsingPredicate方法和NSPredicate語(yǔ)法進(jìn)行過(guò)濾篩選出新的數(shù)組們岖赋。