我知道NSSet不能保持顺序,我很好奇iOS4/iOS5 sdks中的迭代顺序是如何实现的。你有什么想法?NSSet的迭代顺序是什么?
1
A
回答
2
简答: 订单是随机的。
Long答案: 根据定义,未指定顺序。换句话说,这取决于实施。 在常见的实现中,每个对象都被转换为一个整数(散列码),用于快速查找集合中的对象(索引散列表),然后迭代次序由散列码实现(散列码基本上是一个散列码数组索引)。
请注意,如果两个对象具有相同的哈希码(但它们不相等),则它们的顺序仅取决于该集上的插入/删除操作的顺序。
由于常见散列表实现对不同的数据大小使用不同的散列函数,因此当设置大小增加时,顺序可以完全改变。
+1
如果有人对NSSet的实现感兴趣,CFSetRef是开源的,可以在opensource.apple.com找到。它可能通过类集群中的所有类实现,因为它们可以互换。 – JustSid
相关问题
- 1. 转:决定映射键的迭代顺序是什么?
- 2. 通过迭代的NSSet
- 3. 什么接口代表的插入顺序LinkedHashSet迭代
- 4. 什么是通过NSSet和NSDictionary进行迭代的大O符号
- 5. foreach语句是按顺序迭代还是随机顺序?
- 6. 迭代python列表:迭代顺序
- 7. Python字典迭代顺序意外排序。为什么?
- 8. 什么是迭代在Java
- 9. 什么是迭代器,C++?
- 10. 什么是SCARY迭代器?
- 11. 迭代非顺序列
- 12. 切片迭代顺序在
- 13. 怪字典迭代顺序
- 14. 什么是顺序组合?
- 15. 什么是标签顺序
- 16. 什么是顺序洪泛?
- 17. NSSet问题(删除对象和迭代)
- 18. document.cookie的排序顺序是什么?
- 19. 这是1的顺序是什么?
- 20. python迭代器的接口是什么?
- 21. 为什么异常是可迭代的?
- 22. 这是什么样的迭代?
- 23. 迭代的输出是什么
- 24. 程序代码体内元素的首选顺序是什么?为什么?
- 25. 迭代通过XQuery的顺序向后
- 26. 迭代JavaScript对象属性的顺序?
- 27. 通过迭代以相反的顺序
- 28. Python中集合的迭代顺序
- 29. 的JavaScript:顺序迭代承诺功能
- 30. 在这种情况下是否需要NSSet迭代?
顺序是未定义的,正如['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
是的,我知道它可以随时改变,你根本不应该做任何事情。虽然没有明确告知,但它确实有一个算法,这就是我很好奇的。 – aslisabanci
同上。他们最有可能从哈希阵列的一端开始工作。但即使您知道哈希值,哈希阵列的大小也会因历史记录而异,并且会影响给定哈希值的排序。大家可以说的是,如果在一种情况下两个元素彼此接近,则在另一种情况下它们具有比“平均”更接近彼此的可能性。 (也就是说,不应该依赖迭代顺序来“随机化”一组元素)。 –