iphone - Objective-C 中自定义对象的分组

标签 iphone objective-c cocoa

我有 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, //(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 ,我只能按字符串对象分组(不是这样的自定义对象。我说得对吗?)。

提前感谢您的回答。

最佳答案

检查这个答案它与你想要的非常相似

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

关于iphone - Objective-C 中自定义对象的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10816458/

相关文章:

iphone - NSMutableArray 保留计数

ios - Objective C - 对象分配良好实践

objective-c - Cocoa - 如何将特定窗口从 StatusMenu 置于前台

objective-c - 将 NSBitmapImageRep 保存为 NSBMPFileType 文件。错误的 BMP header 和位图内容

iphone - iPhone 项目中应将哪些文件置于版本控制之下?

iphone - 关闭当前模态视图 Controller 的最优雅方式?

iphone - 如何检测完整的 body ,如手、腿?

objective-c - 奇怪的 NSArray 错误

iphone - 通过 App 连接 WiFi 网络

iphone - 如何将日期中的年份更改为当前年份?