0

假设我有一个“节点”实例的集合。整数属性调用 zIndex 将用于对它们进行分组。

将它们存储在其中的优点/缺点是什么:1)数组数组2)数组字典

在伪代码中,我会这样描述预期的结果:

zBuffer[100] = [node1, node 2];
zBuffer[105] = [playerNode, collectable1];
zBuffer[110] = [foreground1, foreground2];

我想知道 zBuffers 应该是什么;NSArrays 必须仅用于顺序读/写吗?喜欢不使用非连续索引?

我尝试使用 NSMutableArray:

[zBuffer objectAtIndex:zOrder]

但如果数组不包含该索引的数据(如越界异常),它就会失败。

感谢您的建议!Ĵ

4

2 回答 2

2

据我所知,您的要求之一是您用于访问的索引zBuffer不连续(100、105、100)。在这种情况下,我不会为此使用数组,因为您可以与数组一起使用的索引必须小于count数组元素的 (如果您有 3 个元素,则索引范围从 0 到 2)。

相反,我会使用NSMutableDictionary,您可以在其中使用 zIndex 键作为您要查找的对象组的“名称”。

这个建议没有考虑您可能有的任何其他要求,特别是关于复杂性和您将在您的节点集合上执行的操作类型(除了通过 zIndex 访问它们)。

于 2012-04-28T09:19:12.347 回答
1

您实际上可以同时提供两者。看起来您想要的是一个稀疏数组:因此您按索引查找对象,但允许在某个索引处没有对象。所以你可以做到。

我会通过创建一个NSMutableArray实现记录的原始方法的子类来做到这一点。在内部,您的子类将使用NSMutableDictionaryfor 存储,以数字(“填充”索引)作为键。-objectAtIndex:返回以该数字作为其键的对象,或者nil该数组在该点是否为空。

数组合约的这种使用存在一些歧义,由您决定如何解决:

  • 是否count返回 1+(使用中的最高索引)或数组中的对象数?
  • 枚举器和快速枚举模式永远不会期望看到nil,因此如果您希望您的类的用户对数组进行枚举,您需要想出一个始终返回一个对象的枚举器(但让我看看它在什么索引处)。
  • 您将无法使用初始化程序的+arrayWithObjects: (id) firstObject,...模式对其进行初始化,因为它们nil用作哨兵。
于 2012-04-28T09:25:22.090 回答