简体   繁体   中英

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"}

You can achieve it using the below code:

 let data:[[String: String]] = [ ["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"]] let dateTimeArray = data.compactMap({ $0["datetime"] }) let uniqueDateTimeArray = Array(Set(dateTimeArray)) var desiredSeparatedArray = [[[String: String]]]() for dateTime in uniqueDateTimeArray { var arrayForDateTime = [[String: String]]() for element in data { if element["datetime"] == dateTime { arrayForItem.append(element) } } desiredSeparatedArray.append(arrayForDateTime) } 

The final desiredSeparatedArray is the answer!!

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 :

在此处输入图片说明

try this

let array = Data as! [[String:String]]

let dictionary = Dictionary(grouping: array, by: {$0["datetime"]!})
var listOfArray = [[[String:String]]]()
dictionary.forEach({listOfArray.append($0.value)})

listOfArray will have all your arrays

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM