如何从包含任意对象的 NSSet 创建排序的 NSArray?

Posted

技术标签:

【中文标题】如何从包含任意对象的 NSSet 创建排序的 NSArray?【英文标题】:How to create a sorted NSArray from an NSSet that contains arbitrary objects? 【发布时间】:2012-11-11 22:54:07 【问题描述】:

我有一个包含许多不同类型对象的 NSSet。通常它将包含 NSDictionaries、NSStrings、NSArrays 和 Classes 的某种组合,即objective-c“Class”类型。我需要一种方法来生成一个包含此 NSSet 中所有对象的 NSArray,但要对其进行排序,以便对于包含相同对象的任何集合,它总是以相同的顺序排列。具体来说,“同一对象”是指价值,而不是地址。排序方式无关紧要,只要一致即可。

到目前为止,我还没有找到一种方法来做到这一点。我找不到在两个任意对象之间进行有序比较的任何方法。有没有人对如何做到这一点有任何建议?

【问题讨论】:

您可能会使用对象的hash,然后对于任何冲突,您可能还可以按对象类进行排序'hash @Paul.s 什么hash?你在考虑java吗? @***foe hash 被定义为NSObject 协议的一部分——参见developer.apple.com/library/mac/documentation/Cocoa/Reference/…——它被NSDictionary 和其他人使用。 @***foe 在NSObject协议中定义 @Paul.s 那就是要走的路。 【参考方案1】:

所有对象都派生自NSObject,因此您可以简单地按[NSObject description] (reference) 排序,这将是对象内容的摘要。

编辑:正如@Paul.s 在评论中指出的那样; hash (reference) 是要走的路(比较起来会更快)。

【讨论】:

...他想确保他在任何自定义类上实现了description,这样最终不会通过指针间接比较。 @Tommy 他在他的问题中没有提到自定义类,只提到标准类。 我从他对“典型地”这个词的使用中跳了出来。 按哈希排序会起作用,但如果碰巧发生哈希冲突,则不稳定(对于此类异构对象,您可能面临更高的风险)。根据应用程序的严重程度,您可以考虑找到一个二级排序原则(如-description)来帮助打破平局。 另请注意,哈希实际上只保证在应用程序的单次运行会话期间是稳定的:不能保证它们对于相同的对象永远是固定的。如果您在多个版本的 ios/Mac 上保留此集合,并期望这些哈希值随着时间的推移保持一致,我会小心的。

以上是关于如何从包含任意对象的 NSSet 创建排序的 NSArray?的主要内容,如果未能解决你的问题,请参考以下文章

将排序的 NSManagedObjects 重新分配给 NSSet

创建一个包含多个 NSMutableDictionary 对象的 NSMutableArray

核心数据麻烦排序相关对象的 NSSet

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

使用 NSPredicate 来判断 NSSet 是不是包含来自另一个 NSSet 的对象 [重复]

NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法