假设我有一个“节点”实例的集合。整数属性调用zIndex将用于对它们进行分组。
存储它们的优点/缺点是什么: 1)数组数组 2)数组字典
在伪代码中,我会像这样描述预期的结果:
zBuffer[100] = [node1, node 2];
zBuffer[105] = [playerNode, collectable1];
zBuffer[110] = [foreground1, foreground2];
我想知道zBuffers应该是什么; NSArrays必须只用于顺序读/写吗?喜欢不使用非连续索引?
我尝试过使用NSMutableArray:
[zBuffer objectAtIndex:zOrder]
但是如果数组不包含该索引的数据(如超出范围的异常),它就会失败。
感谢您的建议! Ĵ
答案 0 :(得分:2)
据我所知,您的一个要求是您用来访问zBuffer
的索引不是连续的(100,105,100)。在这种情况下,我不会使用数组,因为可以与数组一起使用的索引必须小于数组元素的count
(如果你有3个元素,那么索引范围从0到2)。
相反,我会使用NSMutableDictionary
,您可以使用zIndex键作为您要查找的对象组的“名称”。
此建议未考虑您可能具有的任何其他要求,尤其是关于复杂性以及您将在节点集合上执行的操作类型(除了通过zIndex访问它们之外)。
答案 1 :(得分:1)
你实际上可以提供两者。看起来你想拥有的是一个稀疏数组:所以你按索引查找对象,但允许在某个索引处没有对象。所以你可以做到。
我是通过创建一个实现the primitive methods documented的NSMutableArray
子类来实现的。在内部,您的子类将使用NSMutableDictionary
进行存储,并使用数字(“填充”索引)作为键。 -objectAtIndex:
返回带有该数字作为其键的对象,如果该数组在该点为空,则返回nil
。
在使用数组合同时存在一些含糊不清的问题,由您来决定如何解决:
count
会返回1+(使用中的最高索引),还是数组中的对象数?nil
,所以如果你想要你的类的用户,你需要提出一个总是返回一个对象的枚举器(但让我看看它在哪个索引)到数组的枚举器。+arrayWithObjects: (id) firstObject,...
初始化模式对其进行初始化,因为他们使用nil
作为哨兵。