使用具有多个键和缺失数据的 NSSortDescriptor
Using NSSortDescriptor With Multiple Keys and Missing Data
我想对用户创建的联系人进行排序,这些联系人的数据是大杂烩。某些联系人可能填写了每个字段或属性,例如姓氏、名字、公司、phone、电子邮件,而其他人可能只有名字、电子邮件或公司。
使用 NSSort 描述符的习惯方法是创建一个 NSArray,其中数组中的第一个 sortDescriptors 优先于每个连续的 sortDescriptors。因此:
NSSortDescriptor *last =[[NSSortDescriptor alloc]initWithKey:@"lastname" ascending:YES];
NSSortDescriptor *first =[[NSSortDescriptor alloc]initWithKey:@"firstname" ascending:YES];
NSSortDescriptor *company =[[NSSortDescriptor alloc]initWithKey:@"company" ascending:YES];
NSSortDescriptor *email =[[NSSortDescriptor alloc]initWithKey:@"email" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObjects:last, first, company,email, nil]];
应用于
Allen,Joe,microsoft,ja@microsoft.com|Allen,Zack,google,nil|Smith,Tom,Apple,nil
会给你:
Allen, Joe
Allen, Zack
Smith, Tom
看起来不错。
但是,如果您的数据如下所示:
Allen,Joe,nil,ja@gmail.com|nil,Zack,nil,zack@msn.com|nil,nil,nil,raj@gmailcom|nil,nil,cloudflare,nil
以上会给你:
cloudflare
raj@gmail.com
Zack
Allen, Joe
一团糟。
在第二种情况下,我想要一些更有意义的东西,如果只按电子邮件排序电子邮件,然后按公司排序,然后按姓氏排序,然后按名字排序
raj@gmail.com
cloudflare
Allen, Joe
Zack
或者,甚至,他们按顺序排列的任何字段
Allen, Joe
cloudflare
raj@gmail.com
Zack
有什么办法可以做到这一点吗? Apple 如何处理他们的联系人?
感谢任何建议
而不是使用
初始化您的排序描述符
initWithKey:ascending:
你可以使用
initWithKey:ascending:comparator:
在比较器块中
^NSComparisonResult(id obj1, id obj2) {…}
您可以显式检查 nil
个对象,并适当设置比较结果。
我没有检查这个,但它应该可以工作。
我想对用户创建的联系人进行排序,这些联系人的数据是大杂烩。某些联系人可能填写了每个字段或属性,例如姓氏、名字、公司、phone、电子邮件,而其他人可能只有名字、电子邮件或公司。
使用 NSSort 描述符的习惯方法是创建一个 NSArray,其中数组中的第一个 sortDescriptors 优先于每个连续的 sortDescriptors。因此:
NSSortDescriptor *last =[[NSSortDescriptor alloc]initWithKey:@"lastname" ascending:YES];
NSSortDescriptor *first =[[NSSortDescriptor alloc]initWithKey:@"firstname" ascending:YES];
NSSortDescriptor *company =[[NSSortDescriptor alloc]initWithKey:@"company" ascending:YES];
NSSortDescriptor *email =[[NSSortDescriptor alloc]initWithKey:@"email" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObjects:last, first, company,email, nil]];
应用于
Allen,Joe,microsoft,ja@microsoft.com|Allen,Zack,google,nil|Smith,Tom,Apple,nil
会给你:
Allen, Joe
Allen, Zack
Smith, Tom
看起来不错。
但是,如果您的数据如下所示:
Allen,Joe,nil,ja@gmail.com|nil,Zack,nil,zack@msn.com|nil,nil,nil,raj@gmailcom|nil,nil,cloudflare,nil
以上会给你:
cloudflare
raj@gmail.com
Zack
Allen, Joe
一团糟。
在第二种情况下,我想要一些更有意义的东西,如果只按电子邮件排序电子邮件,然后按公司排序,然后按姓氏排序,然后按名字排序
raj@gmail.com
cloudflare
Allen, Joe
Zack
或者,甚至,他们按顺序排列的任何字段
Allen, Joe
cloudflare
raj@gmail.com
Zack
有什么办法可以做到这一点吗? Apple 如何处理他们的联系人?
感谢任何建议
而不是使用
初始化您的排序描述符initWithKey:ascending:
你可以使用
initWithKey:ascending:comparator:
在比较器块中
^NSComparisonResult(id obj1, id obj2) {…}
您可以显式检查 nil
个对象,并适当设置比较结果。
我没有检查这个,但它应该可以工作。