2011-11-16 67 views
1

我知道NSSet不能保持顺序,我很好奇iOS4/iOS5 sdks中的迭代顺序是如何实现的。你有什么想法?NSSet的迭代顺序是什么?

+2

顺序是未定义的,正如['allObjects'方法描述](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/的reference.html%23 // apple_ref/OCC/instm/NSSet中/ allObjects)。它可能取决于底层的实现,并可能随时更改。 – ughoavgfhw

+0

是的,我知道它可以随时改变,你根本不应该做任何事情。虽然没有明确告知,但它确实有一个算法,这就是我很好奇的。 – aslisabanci

+0

同上。他们最有可能从哈希阵列的一端开始工作。但即使您知道哈希值,哈希阵列的大小也会因历史记录而异,并且会影响给定哈希值的排序。大家可以说的是,如果在一种情况下两个元素彼此接近,则在另一种情况下它们具有比“平均”更接近彼此的可能性。 (也就是说,不应该依赖迭代顺序来“随机化”一组元素)。 –

回答

2

简答: 订单是随机的。

Long答案: 根据定义,未指定顺序。换句话说,这取决于实施。 在常见的实现中,每个对象都被转换为一个整数(散列码),用于快速查找集合中的对象(索引散列表),然后迭代次序由散列码实现(散列码基本上是一个散列码数组索引)。

请注意,如果两个对象具有相同的哈希码(但它们不相等),则它们的顺序仅取决于该集上的插入/删除操作的顺序。

由于常见散列表实现对不同的数据大小使用不同的散列函数,因此当设置大小增加时,顺序可以完全改变。

+1

如果有人对NSSet的实现感兴趣,CFSetRef是开源的,可以在opensource.apple.com找到。它可能通过类集群中的所有类实现,因为它们可以互换。 – JustSid