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

2023-11-24

我有 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 对象。

我们可以按年龄或名字等属性对这些对象进行分组吗?

我的预期结果是

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 然后迭代 PersonArray 来获得这个结果,然后首先检查每个

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C 中自定义对象的分组 的相关文章

随机推荐

  • 上的 CSS 动画

    我正在尝试将 CSS 动画应用到 span 元素 但我无法让它工作 我找不到任何说明动画是否可以应用于的资源 span 元素 那么 是我犯了错误 还是跨度动画免疫了 编辑 代码 Inf span class inf o o span rma
  • 是否可以在 google protobuf 中定义类型(枚举或消息)的别名?

    我的原型文件中有两个枚举 它们定义了几乎相同的值 是否可以删除其中一个并保留别名以保持所有代码正常工作 Example enum A a 0 b 1 enum B a 0 b 1 我想要在 C 中有类似 typedef 的东西 enum A
  • 为什么 Firefox 渲染的虚线边框彼此不对齐?

    http betawww helpcurenow org about financial accountability http blog helpcurenow org 我使用的设计包含大量 1px 虚线边框 我注意到 Firefox 中
  • getBooleanExtra() 仅使用默认参数,而不使用 putExtra() 传递的参数

    这是代码 在这一部分中 answerIsTrue变量应该初始化为 true 它正确地执行了 我调试和检查 并且也正确地传递到 putExtra 再次 我调试和检查 mCheatButton setOnClickListener new Vi
  • 如何利用纬度/经度数据进行有效的范围搜索+计数?

    我正在处理由纬度 经度对表示的大量点 这些点不一定是唯一的 该集中可能有多个点位于同一位置 这些点存储在数据库中 我需要做的是找出一种有效执行搜索的方法 以获取任意点给定半径 例如 25 英里 内的点数 计数不需要 100 准确 更重要的是
  • 如何编写全屏 Linux 控制台应用程序/脚本?

    我什至很难用谷歌搜索这个 因为我不知道正确的关键字 一些命令行应用程序 例如 vi 和 less 接管整个控制台屏幕并向用户呈现交互式界面 退出此类应用程序后 屏幕将返回到应用程序启动之前的状态 我想编写一个以这种方式运行的程序 但同样 我
  • 在半尺寸父控制器中呈现模态视图控制器

    我试图在大小为一半父视图控制器的其他视图控制器上呈现模态视图控制器 但它始终以全屏视图显示 我在故事板中创建了具有固定帧大小的自由大小的视图控制器 320 250 var storyboard UIStoryboard name Main
  • 如何确定旅行商问题的起点和终点?

    我有一个求解器可以解决正常的对称 TSP 问题 该解决方案意味着经过所有节点的最短路径 并且不限制哪些节点是路径中的第一个和最后一个节点 有没有办法转化问题 保证一个特定的节点作为起始节点 另一个节点作为结束节点 一种方法是将 I 非常大的
  • 在 Dask DataFrame.apply() 上,在处理实际行之前接收 n 行值 1

    在下面的代码片段中 我希望日志打印数字 0 4 我知道数字可能不是按这个顺序 因为任务将被分解为多个并行操作 代码片段 from dask import dataframe as dd import numpy as np import p
  • 使用 Hyper 显示响应正文仅显示正文的大小

    我尝试使用 Hyper 将 URL 的内容 正文 显示为文本 extern crate hyper use hyper client Client use std io Read fn main let client Client new
  • PostgreSQL 将数据库存储在哪里?

    PostgreSQL 数据库的文件存储在哪里 要查看数据目录所在的位置 请使用此查询 show data directory 要查看所有运行时参数 请使用 show all 您可以创建表空间来在文件系统的其他部分存储数据库对象 要查看可能不
  • 删除 Fetch API 默认超时

    我使用 Google Chrome 或 Mozilla Firefox 的本机获取向我的服务器发送查询 fetch url method POST body formData credentials include 我设置了一个服务器在 3
  • 在 ElasticSearch 中返回部分嵌套文档

    我想搜索嵌套文档数组并仅返回符合特定条件的文档 映射示例如下 book properties title type string chapters type nested properties title type string lengt
  • angularjs:只允许在文本框中输入数字

    在 AngularJS 中 是否有任何可用功能只允许在文本框中输入数字like 此代码显示了如何防止输入非数字符号的示例 angular module app directive onlyDigits function return res
  • 问:回调的调用顺序是否与注册的顺序相同?

    我正在使用Q承诺图书馆 我的代码依赖于这样一个事实 单个 Promise 的回调按照注册的顺序执行 http jsfiddle net HgYtK 1 var deferred Q defer var promise deferred pr
  • android:name 中的前导点真的需要吗? [复制]

    这个问题在这里已经有答案了 可能的重复 注册活动时的 点 是什么意思 在所有 Android 示例中 活动 服务等名称均以点开头
  • 查看设备方向是否已锁定(检测是否启用/禁用自动旋转)

    如何查明设备的屏幕方向是否已锁定 我正在使用 OrientationEventListener 来触发我的应用程序内的一些操作 如果用户锁定了屏幕 我想禁用这些操作 我知道我通常可以这样定位 但如何找出这个锁定方向 int orientat
  • 神秘的形式(function(x){})$x

    物体是什么formals function x x 它存在于函数的形式中 绑定到没有默认值的参数 还有其他方法来引用这个奇怪的对象吗 除了表示空函数参数之外 它还有其他作用吗 以下是可以在控制台中检查的一些属性 gt is formals
  • Android 和桌面上 Java 下的 SVG 处理

    我正在尝试编写一个基于 XML 文件生成 SVG 图像的 Java 应用程序 该应用程序还应该能够显示 SVG 文件 我的应用程序应该在 Android 平台和台式电脑上运行 我读到过有关 Swing Batik 的内容 但据我所知 它在
  • Objective-C 中自定义对象的分组

    我有 Person 类的自定义对象数组 Person NSObject NSString firstName NSString lastName NSString age NSMutableArray personsArray NSMuta