sortUsingComparator 在 NSMutableArray 中的 NSDictionary 上具有多个 objectKeys
Posted
技术标签:
【中文标题】sortUsingComparator 在 NSMutableArray 中的 NSDictionary 上具有多个 objectKeys【英文标题】:sortUsingComparator on NSDictionary in NSMutableArray with multiple objectKeys 【发布时间】:2012-08-07 03:33:18 【问题描述】:我正在尝试对 NSDictionaries 的 mutableArray 进行排序,目前我可以通过使用一个 objectForKey 值进行排序来做到这一点,但问题是这些值中的很多可能是相同的,所以我需要另一个 objectForKey 来排序数组。我想知道,如果第一个 objectForKey 比较返回相同的值,我如何才能进行第二个 objectForKey 比较,依此类推..
目前我正在这样做,它有效..但显然只有一个键。
[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
return [n1 localizedCompare:n2];
];
在我的调查中,我尝试过这个 -
[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
return [n1 localizedCompare:n2];
n1 = [d1 objectForKey:@"ID"];
n2 = [d2 objectForKey:@"ID"];
return [n1 localizedCompare:n2];
];
但是这不起作用,因为它对描述进行排序,然后完全根据 ID 进行排序,如果描述键相同,我想要它,然后按 ID 键对这些值进行排序。如果这不起作用,那么就下去排序之前的键列表..我希望这是有道理的..任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您几乎在问题中描述了解决方案:“如果描述键相同,则按 ID 键对这些值进行排序”。你可以直接把那个英文句子翻译成代码:
[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
NSComparisonResult result = [n1 localizedCompare:n2];
if (result == NSOrderedSame)
n1 = [d1 objectForKey:@"ID"];
n2 = [d2 objectForKey:@"ID"];
result = [n1 localizedCompare:n2];
return result;
];
您还可以使用两个 NSSortDescriptor
对象执行排序:
[dataArrayOfDictionaries sortUsingDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"DESCRIPTION" ascending:YES
selector:@selector(localizedCompare:)],
[NSSortDescriptor sortDescriptorWithKey:@"ID" ascending:YES
selector:@selector(localizedCompare:)],
nil]];
【讨论】:
:P 好吧...我觉得我知道逻辑但不知道代码..我不知道调用 NSOrderedSame...我已经看到在类似问题中使用过..我应该尝试过那 :(... 我现在就试试看 :P 非常感谢你的回复 :) 您给出的第二个示例是否会根据 sortDescriptorWithKey 不断更改数组..即对描述进行排序,然后通过 sortDescriptorWithKey 对 ID 进行更改等等...我要给出它以前..然后生病标记你!感谢所有帮助..第一个示例似乎对我很有用...即使我对这个想法有点迷失(当更高的对象键不一样时会发生什么..稍后继续排序较低的对象键值?或者他们离开了..我试图了解这方面的逻辑。 我不知道您所说的“只是根据 sortDescriptorWithKey 不断更改数组”是什么意思。这两个示例都做同样的事情:它们根据“DESCRIPTION”键的值比较两个元素(字典)。如果“DESCRIPTION”键的值相等,他们只会查看“ID”键的值。 是的..刚刚试了一下,效果一样..很抱歉让您感到困惑:P我以为它会做其他事情..但正如您所说,它们的工作方式相同..您认为第二种解决方案更快吗?不必处理 if 语句..或任何其他特定原因。非常感谢您的帮助:P 我不知道哪个更快。如果重要的话,你应该两者都试一下。以上是关于sortUsingComparator 在 NSMutableArray 中的 NSDictionary 上具有多个 objectKeys的主要内容,如果未能解决你的问题,请参考以下文章
iOS - CoreData - TableViewController - NSInvalidArgumentException',原因:'+entityForName: nil 不是合法的 NSM