首页 > 代码库 > iOS_字典数组 按key分组和排序

iOS_字典数组 按key分组和排序

//
//  main.m
//  SortGroup
//
//  Created by beyond on 14-10-26.
//  Copyright (c) 2014年 beyond.com All rights reserved.
//  按GroupTag分组和 按Order字段排序 enabled表示不启用

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 1.定义一个测试的字典数组
        NSMutableArray *dictArray = @[
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:0],
                                          @"FOrder" : [NSNumber numberWithInt:0],
                                          @"FName" : @"宝玉"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:1],
                                          @"FOrder" : [NSNumber numberWithInt:0],
                                          @"FName" : @"黛玉"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:0],
                                          @"FGroupTag" : [NSNumber numberWithInt:1],
                                          @"FOrder" : [NSNumber numberWithInt:1],
                                          @"FName" : @"宝钗"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:1],
                                          @"FOrder" : [NSNumber numberWithInt:2],
                                          @"FName" : @"湘云"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:2],
                                          @"FOrder" : [NSNumber numberWithInt:0],
                                          @"FName" : @"妙玉"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:3],
                                          @"FOrder" : [NSNumber numberWithInt:0],
                                          @"FName" : @"晴雯"
                                          },
                                      @{
                                          @"FEnabled" : [NSNumber numberWithInt:1],
                                          @"FGroupTag" : [NSNumber numberWithInt:3],
                                          @"FOrder" : [NSNumber numberWithInt:1],
                                          @"FName" : @"袭人"
                                          }
                                      
                                      ];
        // NSArray 转成 NSMutableArray
        // 0、对于不启用的,即enabled为0的字典模型,删除掉
        NSMutableArray *dictArr = [NSMutableArray array];
        for (int i = 0; i < dictArray.count; i++) {
            NSDictionary *dict = dictArray[i];
            if ([[dict objectForKey:@"FEnabled"]intValue] == 1) {
                [dictArr addObject:dict];
            }
        }
        // NSLog(@"清除未启用的字典后的数组:%@",dictArr);
        
        // 1、对数组按GroupTag排序
        NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"FGroupTag" ascending:YES]];
        NSArray *sortedArr = [dictArr sortedArrayUsingDescriptors:sortDesc];
        // NSLog(@"排序后的数组:%@",sortedArr);
        
        
        // 2、对数组进行分组,按GroupTag
        // 遍历,创建组数组,组数组中的每一个元素是一个模型数组
        NSMutableArray *_groupArr = [NSMutableArray array];
        NSMutableArray *currentArr = [NSMutableArray array];
        NSLog(@"class--%@",[currentArr class]);
        // 因为肯定有一个字典返回,先添加一个
        [currentArr addObject:sortedArr[0]];
        [_groupArr addObject:currentArr];
        // 如果不止一个,才要动画添加
        if(sortedArr.count > 1){
            for (int i = 1; i < sortedArr.count; i++) {
                // 先取出组数组中  上一个模型数组的第一个字典模型的groupID
                NSMutableArray *preModelArr = [_groupArr objectAtIndex:_groupArr.count-1];
                int preGroupID = [[[preModelArr objectAtIndex:0] objectForKey:@"FGroupTag"] intValue];
                // 取出当前字典,根据groupID比较,如果相同则添加到同一个模型数组;如果不相同,说明不是同一个组的
                NSDictionary *currentDict = sortedArr[i];
                int groupID = [[currentDict objectForKey:@"FGroupTag"] intValue];
                if (groupID == preGroupID) {
                    [currentArr addObject:currentDict];
                }else{
                    // 如果不相同,说明 有新的一组,那么创建一个模型数组,并添加到组数组_groupArr
                    currentArr = [NSMutableArray array];
                    [currentArr addObject:currentDict];
                    [_groupArr addObject:currentArr];
                }
            }
        }
        // 3、遍历 对每一组 进行排序
        NSMutableArray *tempGroupArr = [NSMutableArray array];
        for (NSMutableArray *arr in _groupArr) {
            NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"FOrder" ascending:YES]];
            NSMutableArray *tempArr = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                if([[obj1 objectForKey:@"FOrder"]intValue] < [[obj2 objectForKey:@"FOrder"]intValue]){
                    return NSOrderedAscending;
                }
                if([[obj1 objectForKey:@"FOrder"]intValue] > [[obj2 objectForKey:@"FOrder"]intValue]){
                    return NSOrderedDescending;
                }
                return NSOrderedSame;
            }];
            [tempGroupArr addObject:tempArr];
        }
        _groupArr = tempGroupArr;
        
        NSLog(@"封装好的group数组:%@",_groupArr);
    }
    return 0;
}

iOS_字典数组 按key分组和排序