2012-05-30 11 views
8

में ऑब्जेक्ट्स मेरे पास है और व्यक्ति कक्षासमूहीकरण ऑब्जेक्टिव-सी

Person : NSObject{ 
    NSString *firstName; 
    NSString *lastName; 
    NSString *age; 
} 

NSMutableArray *personsArray = [NSMutableArray array]; 
Person *personObj1 = [[[Person alloc] init] autorelease]; 
personObj1.firstName = @"John"; 
personObj1.lastName = @"Smith"; 
personObj1.age = @"25"; 
[personsArray addObject: personObj1]; 

Person *personObj2 = [[[Person alloc] init] autorelease]; 
personObj2.firstName = @"John"; 
personObj2.lastName = @"Paul"; 
personObj2.age = @"26"; 
[personsArray addObject: personObj2]; 

Person *personObj3 = [[[Person alloc] init] autorelease]; 
personObj3.firstName = @"David"; 
personObj3.lastName = @"Antony"; 
personObj3.age = @"30"; 
[personsArray addObject: personObj3]; 

अब personsArray व्यक्ति वस्तुओं के 3 ऑब्जेक्ट्स के कस्टम ऑब्जेक्ट की श्रेणी।

क्या हम इस ऑब्जेक्ट को आयु या प्रथम नाम जैसी विशेषता से समूहित कर सकते हैं?

मेरे अपेक्षित परिणाम

NSDictionary { 
    "John" = >{ 
     personObj1, //(Its because personObj1 firstName is John) 
     personObj2 //(Its because personObj2 firstName is John) 
    }, 
    "David" = >{ 
     personObj3, //(Its because personObj3 firstName is David) 
    }, 
} 

मैं जानता हूँ कि मैं एक NSDictionary बनाने के द्वारा इस परिणाम मिलता है और फिर personsArray के माध्यम से दोहराएं, तो प्रत्येक पहले

NSMutableDictionary *myDict = [NSMutableDictionary dictionary]; 

    for (Person *person in personsArray){ 

    if([myDict objectForKey: person.firstName]){ 
     NSMutableArray *array = [myDict objectForKey: person.firstName]; 
     [array addObject:person]; 
     [myDict setObject: array forKey:person.firstName]; 
    }else{ 
     NSMutableArray *array = [NSMutableArray arrayWithObject:person]; 
     [myDict setObject: array forKey:person.firstName]; 
    } 
    } 

    NSLog(@"myDict %@", myDict); 

//Result myDict will give the desired output. 

के लिए जाँच कर सकते हैं लेकिन वहाँ किसी भी बेहतर तरीका है करने के लिए ?

यदि मैं @distinctUnionOfObjects का उपयोग कर रहा हूं, तो मैं केवल स्ट्रिंग ऑब्जेक्ट्स द्वारा समूह कर सकता हूं (ऐसी कस्टम ऑब्जेक्ट्स नहीं। क्या मैं सही हूँ?)।

अग्रिम में उत्तर के लिए धन्यवाद।

+0

धन्यवाद यह मुझे मैं के लिए मदद की समूह के समान परिणाम चाहते हैं। :) –

उत्तर

3

आप इस कस्टम वस्तु एक सरणी

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Firstname" ascending:NO selector:@selector(compare:)]; 

[Array sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]]; 
0

आप यह कर मदद करने के लिए कोड में एक बूंद के लिए छँटाई है कोशिश कर सकते हैं,

-(NSMutableArray *)sortArray:(NSArray *)arrayTosort withKey:(NSString *)key ascending:(BOOL)_ascending 
{ 
    NSSortDescriptor *sortDescriptor; 
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key 
               ascending:_ascending] ; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    return [[arrayTosort sortedArrayUsingDescriptors:sortDescriptors] mutableCopy]; 
} 

यहाँ कुंजी key या keypath है।

0

NSArray में विधि द्वारा समूह में निर्मित नहीं है। आपका उदाहरण कार्यान्वयन एक श्रेणी के रूप में जोड़ा जा सकता है।

दुर्भाग्य से, @distinctUnionOfObjects ऑपरेशन केवल प्रथम नाम की तारों को वापस कर देगा: जॉन, डेविड। यह group by ऑपरेशन नहीं करेगा, न ही ऐसा कोई ऑपरेशन है।

Collection Operations

3

मैं Linq-to-ObjectiveC कहा जाता है एक छोटा सा पुस्तकालय जो तरीकों जो सरणियों क्वेरी करने के लिए आसान बनाने के है के एक नंबर प्रदान करता है बनाया है।

NSDictionary* groupedByName = [personsArray groupBy:^id(id person) { 
    return [person firstName]; 
}]; 

यह एक शब्दकोश जहां चाबियाँ अलग पहला नाम हैं हो जाएंगे और प्रत्येक मान 'व्यक्ति' वस्तुओं है की एक सरणी है: आदेश समूह कार्रवाई करने के लिए आप की आवश्यकता होती है तो आप बस निम्न कर सकते हैं दिया गया पहला नाम।

1
- (NSDictionary *)groupObjectsInArray:(NSArray *)array byKey:(id <NSCopying> (^)(id item))keyForItemBlock 
{ 
    NSMutableDictionary *groupedItems = [NSMutableDictionary new]; 
    for (id item in array) 
    { 
     id <NSCopying> key = keyForItemBlock(item); 
     NSParameterAssert(key); 

     NSMutableArray *arrayForKey = groupedItems[key]; 
     if (arrayForKey == nil) 
     { 
      arrayForKey = [NSMutableArray new]; 
      groupedItems[key] = arrayForKey; 
     } 
     [arrayForKey addObject:item]; 
    } 
    return groupedItems; 
} 
11

चेकआउट यह उत्तर देता है बहुत तुम क्या चाहते

https://stackoverflow.com/a/15375756/1190861

के समान है आपके मामले में कोड के रूप में निम्नलिखित होगा:

NSMutableDictionary *result = [NSMutableDictionary new]; 

NSArray *distinctNames; 
distinctNames = [personsArray valueForKeyPath:@"@distinctUnionOfObjects.firstName"]; 
for (NSString *name in distinctNames) { 
    NSPredicate predicate = [NSPredicate predicateWithFormat:@"firstName = %@", name]; 
    NSArray *persons = [personsArray filteredArrayUsingPredicate:predicate]; 
    [result setObject:persons forKey:name]; 
} 

NSLog(@"%@", result); 
संबंधित मुद्दे