iOS 數(shù)組分組

之前介紹過數(shù)組的排序,現(xiàn)在介紹數(shù)組的分組。什么意思呢?由于后臺(tái)給我們的數(shù)據(jù)是一個(gè)數(shù)組,里面有很多分類,我們把每個(gè)不同的分類放到一個(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ù)組按照分類拆分多個(gè)。

下面舉一個(gè)我工作中的例子。之前介紹過數(shù)據(jù)的排序下面直接進(jìn)入怎么分組的。一般有兩個(gè)方法,第一種方法利用set 的不重復(fù)性來做。第二種方法利用集合的KVC 運(yùn)算符來做。

第一種方法利用set 的不重復(fù)性來做:

//對(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本身是無序的直接排序變成有序的利用sortedArrayUsingDescriptors方法。

3:利用數(shù)組的filteredArrayUsingPredicate方法和NSPredicate語法進(jìn)行過濾篩選出新的數(shù)組們。

注意:NSPredicate語法類似寫SQL語句類似,比如過濾文章開頭大于3返回?cái)?shù)組。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 3”];然后調(diào)用數(shù)組filteredArrayUsingPredicate方法即可。

第二種方法利用集合的KVC 運(yùn)算符來做,由于上面第一種方法要循環(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ì)分類進(jìn)行排序

3:和第一種方法一樣,利用數(shù)組的filteredArrayUsingPredicate方法和NSPredicate語法進(jìn)行過濾篩選出新的數(shù)組們。

總結(jié):利用集合的KVC方法可以簡(jiǎn)化處理一些復(fù)雜的操作,比如計(jì)算開頭數(shù)組的元素sum總和你可能會(huì)用循環(huán),求最大,平均值都可以使用這個(gè)集合運(yùn)算符。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性...
    JW_T閱讀 519評(píng)論 0 1
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    sumrain_cloud閱讀 371評(píng)論 0 1
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    如果我們是朋友閱讀 744評(píng)論 0 9
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 836評(píng)論 0 4
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    small_Sun閱讀 487評(píng)論 0 4

友情鏈接更多精彩內(nèi)容