模糊NSDictionary - 使用最近的密钥

时间:2011-03-27 09:31:15

标签: objective-c nsdictionary

我有一个大约4000个数字的列表,例如:{10, 20, 30, 40, 50,...}

每个数字都是NSDictionary中的一个键,因此我可以获取与数字相关联的对象,例如

[NSDictionary objectForKey:[NSNumber numberWithInt:20];

但是如果密钥不在字典中,我想找到最近的密钥(假设值之间存在有意义的关系,在我的例子中,10> 20> 30等)。

所以,例如

[NSDictionary objectForKey:[NSNumberWithInt:19]] would return the value for key:20.

或者是否有其他数据结构更适合这样做?我想过使用一个排序的NSArray,其中键是数组索引,然后如果object为null,则继续递增数组指针直到找到该对象,但是这将导致一个包含999,999个元素的稀疏填充数组:)< / p>

由于

2 个答案:

答案 0 :(得分:5)

基本上,您需要保留键的排序列表(NSMutableArray)。要查找密钥,请使用传递indexOfObject:inSortedRange:options:usingComparator:的NSArray的NSBinarySearchingInsertionIndex方法作为选项,这将执行二进制搜索,即使它找不到确切的元素也会为您提供索引。您必须自己获取两个密钥并进行比较。

答案 1 :(得分:1)

假设您的数字列表按升序排列,您可以在数组中执行二进制搜索。 因此,当查找键x时,您将从index array.length / 2开始,将该位置的键与x进行比较,如果大于x,则继续左侧部分;如果小于x,则使用右侧部分继续。继续,直到找到最接近x的键。

非常快(在你的情况下关于log(4000)~12个数组查找)并且不需要额外的存储。