如何从包含任意对象的 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
如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?