如何在字典中搜索与查询最接近的值?假设我搜索0.000475,我知道它不可用,但我想返回它最接近的值0.000500。
我想我会使用keysOfEntriesPassingTest在字典上实现这一点,但对如何解决这个问题一无所知。
<key>1/8000</key><real>0.000125</real>
<key>1/6400</key><real>0.000156</real>
<key>1/5000</key><real>0.000200</real>
<key>1/4000</key><real>0.000250</real>
<key>1/3200</key><real>0.000313</real>
<key>1/2500</key><real>0.000400</real>
<key>1/2000</key><real>0.000500</real>
<key>1/1600</key><real>0.000625</real>
答案 0 :(得分:1)
由于keysOfEntriesPassingTest
返回一组值,因此它更适合于从查询值中查找给定epsilon范围内的所有键,但不能找到像这种情况一样的单个最近键的任务
所以这是一种方法,虽然它确实有点低效:
NSDictionary* dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0],
[NSNumber numberWithFloat:2.0],
[NSNumber numberWithFloat:3.0], nil]
forKeys:[NSArray arrayWithObjects:@"foo", @"bar", @"baz", nil]];
float query = ...;
NSArray* matches = [dict keysSortedByValueUsingComparator:^(id obj1, id obj2) {
NSNumber* x = [NSNumber numberWithFloat:fabs([obj1 floatValue] - query)];
NSNumber* y = [NSNumber numberWithFloat:fabs([obj2 floatValue] - query)];
return [x compare:y];
}];
然后 [matches objectAtIndex:0]
将保持具有最佳匹配的值的键,索引1为第二最佳匹配的键,等等。
编辑:yap,如果你不需要其他匹配,几乎肯定最好只调用enumerateKeysAndObjectsUsingBlock:
和传递块之外的变量,它保存最接近匹配的键/值到目前为止找到并在当前值更接近查询值时更新它。