Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 模糊字典-使用最近键_Objective C_Nsdictionary - Fatal编程技术网

Objective c 模糊字典-使用最近键

Objective c 模糊字典-使用最近键,objective-c,nsdictionary,Objective C,Nsdictionary,我有一个大约4000个数字的列表,例如:{10,20,30,40,50,} 每个数字都是NSDictionary中的一个键,因此我可以获取与数字关联的对象,例如 [NSDictionary objectForKey:[NSNumber numberWithInt:20]; 但是,如果该键不在字典中,我希望找到最近的键(假设值之间存在有意义的关系,在我的示例中为10>20>30等) 例如 [NSDictionary objectForKey:[NSNumberWithInt:19]] would

我有一个大约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,其中键是数组索引,然后如果对象为null,则继续递增数组指针,直到找到该对象为止,但是这将导致一个包含999999个元素的稀疏数组:)


谢谢

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


这非常快(在您的情况下是日志(4000)~12个数组查找),并且不需要额外的存储。

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