Search code examples
iosobjective-cmacosnsmutablearraynsarray

How to group object in NSMutableArray and divide to separate NSMutableArray in Objective-C


I have NSMutableArray like this:

// NSMutableArray *Data = (NSMUtableArray(NSDictionary))
       Data = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.03"},
       {"Device": "A2", "Temperature": "25", "datetime": "2013.02.03"},         
       {"Device": "A3", "Temperature": "25", "datetime": "2013.02.03"},        
       {"Device": "A1", "Temperature": "25", "datetime": "2013.02.04"},
       {"Device": "A2", "Temperature": "25", "datetime": "2013.02.04"}.

How can I breakdown and group it into separated NSMutableArray follow "date time". As above case will be divide to:

Data_d1 = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.03"},
          {"Device": "A2", "Temperature": "25", "datetime": "2013.02.03"},
          {"Device": "A3", "Temperature": "25", "datetime": "2013.02.03"}

And

Data_d2 = {"Device": "A1", "Temperature": "25", "datetime": "2013.02.04"},
          {"Device": "A2", "Temperature": "25", "datetime": "2013.02.04"}

Solution

  • if you have array of array of dictionary like this :

    var data = [["Device": "A1", "Temperature": "25", "datetime": "2013.02.02"],
    ["Device": "A2", "Temperature": "25", "datetime": "2013.02.03"],
    ["Device": "A3", "Temperature": "25", "datetime": "2013.02.03"],
    ["Device": "A1", "Temperature": "25", "datetime": "2013.02.04"],
    ["Device": "A2", "Temperature": "25", "datetime": "2013.02.04"]]
    

    Then you can segregate them on basis of any key as follows:

    var dateArray = data.compactMap{ $0["datetime"] }
    let uDateArray = Array(Set(dateArray))
    var segregatedArray = [[[String: String]]]()
    for dateTime in uDateArray {
        segregatedArray.append(data.filter{$0["datetime"] == dateTime})
    }
    print(segregatedArray);
    

    Adding as per request Objective-C version with Array of dictionary as raw data.

    Consider you have array of dictionary like following:

     NSArray *array=@[
         @{@"Device": @"A1",@"Temperature":@"25",@"datetime":@"2013.02.03"},
         @{@"Device":@"A2",@"Temperature":@"25",@"datetime":@"2013.02.03"},
         @{@"Device":@"A3",@"Temperature":@"25",@"datetime":@"2013.02.03"},
         @{@"Device":@"A1",@"Temperature":@"25",@"datetime":@"2013.02.04"},
         @{@"Device":@"X1",@"Temperature":@"26",@"datetime":@"2013.02.07"},
         @{@"Device":@"Y1",@"Temperature":@"27",@"datetime":@"2013.02.07"},
         @{@"Device":@"A2",@"Temperature":@"25",@"datetime":@"2013.02.04"}];
    

    Then you can segregate them as follows:

        NSMutableDictionary* mutableDic = [[NSMutableDictionary alloc] initWithCapacity:1];
        for (NSDictionary* dic in array) {
            NSString* dateTime = [dic valueForKey:@"datetime"];
            NSMutableArray* data = [mutableDic valueForKey:dateTime];
            if(data != nil)//data with this key avalaibe, add further.
            {
                [data addObject:dic];
            }
            else//data with this key not avalaibe, make a mutable array with this dic and add.
            {
                NSMutableArray* newData = [[NSMutableArray alloc] initWithObjects:dic, nil];
                [mutableDic setValue:newData forKey:dateTime];
            }
        }
        NSLog(@"%@", mutableDic);
    

    you can segregate on basis of any key just put that key here [dic valueForKey:@"datetime"];. Instead of datetime, you may put Device as asked in comment.

    Screen shot of debugger after segregation :

    enter image description here