我应该如何为同一对象类型的多个实例存储和比较4个值?

时间:2013-06-05 20:21:52

标签: objective-c cocoa

我在Objective-C / Cocoa工作,我有一个对象类型Tile。每个都有一个签名,可以表示为4个不同的整数值。如果我输出一些这些值作为字符串,- es分隔值,它看起来像这样:

signature: 4-4-3-3
signature: 4-3-3-3
signature: 0-0-0-1
signature: 0-0-1-1
signature: 0-0-1-0
signature: 1-1-1-2
signature: 1-1-2-2
signature: 1-1-2-1
signature: 3-3-3-1
signature: 3-3-1-1
signature: 3-3-1-3
signature: 4-4-4-3
signature: 4-4-3-3

我目前正在将每个值存储为unsigned short。永远不会有负值,最大值不可能超过15左右。零是有效值。没有'零'价值。

我希望能够致电:

[myTile signature]检索值。

[myTile matches:otherTile]返回BOOL,表示签名是否匹配。

存储此“签名”并将其与其他Tile实例的签名进行比较的最有效方法是什么?看起来字符串比较会很慢......

1 个答案:

答案 0 :(得分:3)

首先,我会使用常用的方法名称执行这些任务:descriptionisEqual*:

关于你的问题,我认为最好的方法是更简单:

- (BOOL)isEqualToTile:(Tile)tile
{
    return self.value1 == tile.value1 &&
           self.value2 == tile.value2 &&
           self.value3 == tile.value3 &&
           self.value4 == tile.value4;
}

另一种可能性是实施hash

编辑:如果我是你,我不会过分担心表现。

  • 因为8次比较很快。我的意思是真的快。如果你要组合一个小基准,你会发现每个比较需要〜1.5E-8s才能运行。这对我来说并不多,但我只想说如果我的数学算法合适,你可以在100毫秒内完成10,000,000次比较。
  • 因为如果有一天你发现你的软件很慢,那么现在是时候调查这种缓慢的起源(我怀疑它会来自这种方法),但要记住premature optimization is the root of all evil
  • 因为它需要12秒才能实现它,并且可能需要更多的时间来考虑一个有效的hash函数。不要过度思考它。见我的第二点。
  • 因为,如果你需要一天时间来优化这个功能(如果你现在正在做,重新阅读我的第二点),Cocoa有一些方便的工具可以使你的软件做出如此愚蠢和重复的任务并行。没有挠头,只能在你的一个(不断增长的数量)核心上加快速度。