在Objective-C中对自定义对象进行分组 [英] Grouping of Custom Objects in Objective-C

查看:126
本文介绍了在Objective-C中对自定义对象进行分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有Person类的自定义对象数组

  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个Person对象。



我们可以按照age或firstName等属性对这些对象进行分组吗?



我的预期结果是

  NSDictionary {
John=> {
personObj1,//(因为personObj1 firstName是John)
personObj2 //(因为personObj2 firstName John)
},
David=> {
personObj3,//(因为personObj3 firstName是David)
},
}



我知道我可以通过创建一个NSDictionary,然后通过personsArray迭代,然后检查每个第一个

  NSMutableDictionary * myDict = [NSMutableDictionary dictionary]; 

for(Person * person in personsArray){

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

NSLog(@myDict%@,myDict);

//结果myDict会给出所需的输出。

但是有更好的方法吗?



如果我使用 @distinctUnionOfObjects ,我可以只分组字符串对象(不是这样的自定义对象。

解决方案



感谢您的回答。 >



http:/ /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);


I have and array of custom objects of Person Class

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];

Now personsArray contains 3 objects of Person objects.

Can we group this objects by attribute like age or firstName ?

My expected result is

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

I know I can get this result by creating an NSDictionary and then Iterate through personsArray, then check for each first

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. 

But is there any better way to do ?

If I am using @distinctUnionOfObjects , I can group by string objects only (Not such custom objects. Am I right ?).

Thanks for the answer in advance.

解决方案

Checkout this answers it is very similar to what you want

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

The code in your case will be as the following:

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);

这篇关于在Objective-C中对自定义对象进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆