I have an NSArray and each object in the array has a groupId and a name. Each object is unique but there are many with the same groupId. Is there a way i can tear the array apart and rebuild it so that the names are grouped into a single object with the corresponding groubId? Here is what the array currently looks like:
2013-03-1220:50:05.572 appName[4102:702] the array:({ groupId =1; name ="Dan";},{ groupId =1; name ="Matt";},{ groupId =2; name ="Steve";},{ groupId =2; name ="Mike";},{ groupId =3; name ="John";},{ groupId =4; name ="Kevin";})
This is what I would like it to look like:
2013-03-1220:50:05.572 appName[4102:702] the array:({ groupId =1; name1 ="Dan"; name2 ="Matt";},{ groupId =2; name1 ="Steve"; name2 ="Mike";},{ groupId =3; name ="John";},{ groupId =4; name ="Kevin";})
EDIT: I've tried & failed with many attempts, most along the lines of something like this (sloppy recreation, but to give an idea):
This calls for a NSDictionary of NSArrays. There's no quick and elegant way - you'd have to scroll through the source.
NSMutableDictionary*d =[NSMutableDictionary dictionaryWithCapacity:10];//Or use alloc/initfor(SomeObject o in appname)//What's the type of objects? you tell me{NSObject*ID =[o objectForKey:@"groupId"];NSMutableArray*a =[d objectForKey: ID];if(a ==nil){ a =[NSMutableArray arrayWithCapacity:10];[d setObject:a forKey: ID];}[a addObject:[o objectForKey:@"name"]];}
EDIT: edited to not assume the datatype of the key.
回答3:
This is similar to Seva's answer, but it can be added as a category method on NSArray:
This isn't exactly the same as the original answer since it will preserve the person dictionary as the values in the array, but you can then just read the name property off of that.
回答4:
Swift implementation of Sergery's answer for my fellow noobs.
classPeople:NSObject{var groupId:Stringvar name :String init(groupId:String, name:String){self.groupId = groupId self.name = name }}let matt =People(groupId:"1", name:"matt")let john =People(groupId:"2", name:"john")let steve =People(groupId:"3", name:"steve")let alice =People(groupId:"4", name:"alice")let bill =People(groupId:"1", name:"bill")let bob =People(groupId:"2", name:"bob")let jack =People(groupId:"3", name:"jack")let dan =People(groupId:"4", name:"dan")let kevin =People(groupId:"1", name:"kevin")let mike =People(groupId:"2", name:"mike")let daniel =People(groupId:"3", name:"daniel")let arrayOfPeople =NSArray(objects: matt, john, steve, alice, bill, bob, jack, dan, kevin, mike, daniel)var resultArray =NSMutableArray()let groups = arrayOfPeople.valueForKeyPath("@distinctUnionOfObjects.groupId")as[String]for groupId in groups {var entry =NSMutableDictionary() entry.setObject(groupId, forKey:"groupId")let predicate =NSPredicate(format:"groupId = %@", argumentArray:[groupId])var groupNames = arrayOfPeople.filteredArrayUsingPredicate(predicate)for i in0..<groupNames.count {let people = groupNames[i]asPeoplelet name = people.name entry.setObject(name, forKey:("name\(i)"))} resultArray.addObject(entry)} println(resultArray)
Note the @ sign in valueForKeyPath. that tripped me up a little :)
回答5:
The below code will Rebuild an NSArray by grouping objects w.r.t any matching keys in each dictionary in that array
//only to a take unique keys. (key order should be maintained)NSMutableArray*aMutableArray =[[NSMutableArray alloc]init];NSMutableDictionary*dictFromArray =[NSMutableDictionary dictionary];for(NSDictionary*eachDict in arrOriginal){//Collecting all unique key in order of initial arrayNSString*eachKey =[eachDict objectForKey:@"roomType"];if(![aMutableArray containsObject:eachKey]){[aMutableArray addObject:eachKey];}NSMutableArray*tmp =[grouped objectForKey:key]; tmp =[dictFromArray objectForKey:eachKey];if(!tmp){ tmp =[NSMutableArray array];[dictFromArray setObject:tmp forKey:eachKey];}[tmp addObject:eachDict];}//NSLog(@"dictFromArray %@",dictFromArray);//NSLog(@"Unique Keys :: %@",aMutableArray);
//Converting from dictionary to array again...
self.finalArray =[[NSMutableArray alloc]init];for(NSString*uniqueKey in aMutableArray){NSDictionary*aUniqueKeyDict =@{@"groupKey":uniqueKey,@"featureValues":[dictFromArray objectForKey:uniqueKey]};[self.finalArray addObject:aUniqueKeyDict];}